MySQL千万级数据表的优化实战记录


Posted in MySQL onAugust 04, 2021

前言

这里先说明一下,网上很多人说阿里规定500w数据就要分库分表。实际上,这个500w并不是定义死的,而是与MySQL的配置以及机器的硬件有关。MySQL为了提升性能,会将表的索引装载到内存中。但是当表的数据到达一定的量的时候,会导致内存无法存储这些索引,无法存储索引,就只能进行磁盘IO,从而导致性能下降。

实战调优

我这里有张表,数据有1000w,目前只有一个主键索引

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `uname` varchar(20) DEFAULT NULL COMMENT '账号',
  `pwd` varchar(20) DEFAULT NULL COMMENT '密码',
  `addr` varchar(80) DEFAULT NULL COMMENT '地址',
  `tel` varchar(20) DEFAULT NULL COMMENT '电话',
  `regtime` char(30) DEFAULT NULL COMMENT '注册时间',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10000003 DEFAULT CHARSET=utf8;

MySQL千万级数据表的优化实战记录

查询所有大概16s。可谓是相当慢了。通常我们一个后台系统,比如这个是一个电商平台,这个是用户表。后台管理系统,一般会查询这些用户信息,做一些操作,比如后台直接新增用户啊,或者删除用户啊这些操作。

所以这里就诞生了两个需求,一个是查询count,一个是分页查询

我们分别来测试一下count用的时间和分页查询所用的时间

select * from user limit 1, 10   //几乎不用时
select * from user limit 1000000, 10  //0.35s
select * from user limit 5000000, 10  //1.7s
select * from user limit 9000000, 10  //2.8s
select count(1) from user  //1.7s

从上面查询所用时间可以看出来,如果是分页查询的话,查询的数据越往后用时是越长的,查询count也需要1.7s。这显然是不符合我们的要求的。所以,这里我们就需要优化。首先我们这里进行索引优化试试
首先看一下这是只有主键索引的执行计划:

MySQL千万级数据表的优化实战记录

alter table `user` add INDEX `sindex` (`uname`,`pwd`,`addr`,`tel`,`regtime`,`age`)

MySQL千万级数据表的优化实战记录

看上面的执行计划,虽然type是从all->index,走了sindex索引,但是实际上查询速度并没有发生改变。

其实,创建联合索引,是为了有条件查询的时候速度更快,而不是全表查询

select * from user where uname='6.445329111484186' //3.5s(无联合索引)
select * from user where uname='6.445329111484186' //0.003s(有联合索引)

所以这就是有联合索引和无索引的差距

这里基本上可以证明,加了索引和不加索引,进行全表查询的时候,效率就是会很慢

既然索引这个结果已经不好使了,那就只能找其他方案了。根据我之前mysql面试里面讲的,count我们可以单独存储到一个表里面

CREATE TABLE `attribute` (
  `id` int(11) NOT NULL,
  `formname` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '表名',
  `formcount` int(11) NOT NULL COMMENT '表总数据',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

MySQL千万级数据表的优化实战记录

这里说一下,这种表一般不会查所有,只会查询一条,所以建表的时候,可以建成hash

select formcount from attribute where formname='user' //几乎不用时

count就进行优化完了。如果上面有选择条件的话,就可以建立索引,通过走索引筛选的形式来查询,这样就可以不用读这个count了。

那么,count是没问题了,分页查询优化要如何优化呢?这里可以使用子查询来优化

select * from user where
id>=(select id from user limit 9000000,1) limit 10 //1.7s

其实子查询这种写法,判断id,其实就是通过覆盖索引来查询。效率会大大增加。不过我这里测试是1.7s,以前在公司优化这方面的时候,比这个查询时间要低,大家也可以自己生成数据自己测试

但是如果说数据量太大了,我还是建议走es或者进行一些默认选择,count可以单独列出来

至此,一个千万级的数据分页查询的优化就完成了。

总结

到此这篇关于MySQL千万级数据表优化的文章就介绍到这了,更多相关MySQL千万级数据表优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql 性能监控及调优
Apr 06 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
新手入门Mysql--概念
Jun 18 MySQL
MySQL中存储时间的最佳实践指南
Jul 01 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
Windows下载并安装MySQL8.0.x 版本的完整教程
Apr 10 MySQL
Mysql中常用的join连接方式
May 11 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 #MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 #MySQL
SQL之各种join小结详细讲解
SQL实现LeetCode(175.联合两表)
Aug 04 #MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 #MySQL
sql注入教程之类型以及提交注入
MySQL子查询中order by不生效问题的解决方法
Aug 02 #MySQL
You might like
php中对2个数组相加的函数
2011/06/24 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
php session的锁和并发
2016/01/22 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
jQuery 位置插件
2008/12/25 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
jQuery异步验证用户名是否存在示例代码
2014/05/21 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
如何使用JavaScript检测空闲的浏览器选项卡
2020/05/28 Javascript
Python程序员开发中常犯的10个错误
2014/07/07 Python
简单讲解Python中的字符串与字符串的输入输出
2016/03/13 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
Python基于进程池实现多进程过程解析
2020/04/30 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
一套SQL笔试题
2016/08/14 面试题
小学生防溺水广播稿
2014/01/12 职场文书
酒店节能减排方案
2014/05/26 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
邀请函的格式
2015/01/30 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
就业证明函
2015/06/17 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
Java 写一个简单的图书管理系统
2022/04/26 Java/Android