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 05 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
MySQL完整性约束的定义与实例教程
May 30 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
mysqldump进行数据备份详解
Jul 15 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
使用字符串函数输出整数化的PHP版本号
2006/10/09 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
js正确获取元素样式详解
2009/08/07 Javascript
用JS控制回车事件的代码
2011/02/20 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
2016/10/16 Javascript
jquery横向纵向鼠标滚轮全屏切换
2017/02/27 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
Python内置函数dir详解
2015/04/14 Python
Python 正则表达式入门(初级篇)
2016/12/07 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
个人应聘自我评价分享
2013/11/18 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
大学生活学习的自我评价
2013/12/03 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
MySQL的存储过程和相关函数
2022/04/26 MySQL