前言

【问诊一】

MySql 索引失效、回表解析 【陈先生们,先看这篇】

【问诊二】

正文

话不多说,先当场整点货,搞个200w条数据:

准备一张表:

建个函数来造数据:

估计很多初学者可能很少写这些,没关系,可以一起动手试着玩玩:

CREATE DEFINER=`mytoor`@`%` FUNCTION `JcTestData`() RETURNS int(11)
BEGIN                                
    DECLARE num INT DEFAULT 2000000;         
    DECLARE i INT DEFAULT 0; 
    
    WHILE i < num DO             
    INSERT INTO test_order(`platform_sn`,`third_sn`,`type`,`create_time`) 
         VALUES(CONCAT('SN',i),UUID(),1,now());
        SET i =  i + 1;
    END WHILE;        
    RETURN i;
END

简单说一嘴,看明白的可以无视这个(还是那句话学习,是先知后知而已):

点击运行:

29秒造完,还可以。

货到齐了,准备开搞:

开始演练:

先给type加个索引,模拟一下真实查询场景:

再把几条数据的type数据稍微改一下,:

先按照正常的场景分页查询 limit 0,50:

sql:

select * FROM test_order  where type=1  limit 0,50;

可以看到查询 limit 0,50  速度是很快的,0.022秒:

我们接下来模拟成查询N页之后的数据 limit  1200000,50:

120W 条后,偏移 50条数据,roll出来

sql:

select * FROM test_order  where type=1  limit 1200000,50;

看看效果,用了3.765秒:

explain:

可以看到已经命中了索引 index_type ,但是还是比较慢,为什么呢?

慢的原因 ① 

① 索引 index_type 是非聚簇索引, 而我们查询的语句 是select * ,包含了其他字段。

通过非聚簇索引 index_type  roll出来的数据列,只有type 和 id ,那么为了拿其他字段,

就会通过先取聚簇索引 id ,再根据id 拿出所有列值,这也就是回表操作。

慢的原因 ②

limit 第一个数,第二个数

limit 的roll数据规则是什么 ?

是确定sql的符合条件的数据,
根据 limit的 第一个数 + 第二个数,先计算出总共需要扫描拿到的数据总量是多少,
再去从头开始遍历到第一个数的数据行,开始丢到返回集,
丢多少条呢? 第二个数决定着丢多少条。

limit 示例讲解

也就是limit 0,50 :

计算 0+ 50  =50 , 拿出符合条件的50条 , 从头开始匹对第一个数  0,OK,从0开始就可以把数据丢到返回集。

丢多少?  第二个数是 50,所以会一条条丢,丢50条 ,最后返回数据。

那么如果是我们文章里面执行的  limit 1200000,50 :

120w+50  ....

意味着为了拿50条数据,需要扫描出 1200050 条数据,然后开始迅速得检索第一个数是120W,开始丢掉前面120W条没有意义的数据,然后确定第二个数是50,开始整50条数据丢到返回集里面,最后返回数据。

那么既然知道了这个情况, 我们可以开始玩优化操作。

方案1 :

针对回表方面做优化

如果我们能拿到我们知道返回数据的 id 集,作为条件,这样通过命中非聚簇索引type的时候,直接就能拿到id,这样通过id拿数据列,这样就方便了。

sql:

select * FROM test_order  where id in

(

select id from (select id FROM test_order  where type=1 limit 1200000,50) child

)

看下效果:

3.765秒 变成了 1.56秒 !!!

3.765秒 变成了 1.56秒 !!!

3.765秒 变成了 1.56秒 !!!

为啥?

explain看看:

这种情形已经是快了很多了, 但是还有没有操作空间?

回答 : 有。

可以看到当前的优化sql ,其实 还是涉及到了 limit 1200000,50 ,这也就是主要耗费时间的地方。

方案2:使用最小条件值

分页查询避免跳页查询, 我们把上一页的id,作为下一页的起始条件。

上面分析这个sql的规则 :
 看一下这个limit 120W,50的数据情况:

如果我们加上 条件  id >=1200008  , 是不是就非常nice了 。

sql:

select * FROM test_order  where type=1 and id >=1200008 limit 50;

看看效果,0.022秒,就跟直接 limit 0,50 一样了效率了:

explain:

都中了主键索引了,key:PRINARY

服务端使用方案2:

这种情况,如果是我们代码里面去使用,只需要在操作大批量数据的时候,将上一批数据的最后一条数据的id拿出来。

给到下一批筛选数据,作为最小ID的 条件即可。

其实也就是之前我写过一篇文章留下来的分页优化操作空间:

Springboot 手动分页查询,分批批量插入数据_小目标青年的博客-CSDN博客

可以在这篇基础上,加上 上一批次的最小ID作为条件,效率翻倍!

配合前端使用方案2:

给大家看一个现成的大系统的一个触发机制调用图:

随着滑动,自动加载下一页数据, 起始也就是把上一页的最小ID值(可以传其他条件值也可以)透传到下一页。这种其实我们产品体验上的滑动加载,瀑布流形式。

好了,该篇就到这,关注我,点赞,收藏(给我知道你们在,给我知道你们懂我)。

Mysql 我随手造200W条数据,给你们讲讲分页优化。相关推荐

  1. mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)

    mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式) 首先将要导入的数据文件top5000W.txt放入到数据库数据目录/var/local/mysql/data/${d ...

  2. mysql通过命令添加1条数据

    mysql通过命令添加1条数据 1.语法: INSERT INTO 表名 (字段1,字段2,...字段n) VALUES (值1,值2,...值n); 2.语法解析: INSERT INTO ... ...

  3. php mysql只获取一条数据_php mysql 查询只返回第一条数据

    php mysql 查询只返回第一条数据 $search = mysql_query("select * from `info`"); $search = mysql_fetch_ ...

  4. MySQL 快速批量创建千万条数据 千万级数据

     MySQL 快速批量创建千万条数据 千万级数据 一.实现思路 1.创建一张users表,数据库引擎调整为: MyISAM 2.使用存储过程实现,用循环语句,批量插入1kw次.( WHILE ... ...

  5. mysql select count 5万条数据很慢_mysql亿级数据数据库优化方案测试银行交易流水记录的查询...

    点击上方△蓝字关注我们 带你征服编程和泡妞两座大山 对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以 ...

  6. mysql一次读取500条数据_mysql批量插入500条数据

    表格结构如下 需求name和password字段,生成如下格式: 总共批量生成500个. 解决思路:可以用mysql 存储过程 如果linux环境下可以用shell 我们先测试第一种,用存储过程.DE ...

  7. mysql select count 5万条数据很慢_Mysql注入总结

    1 0X00 简介 本文是关于Mysql注入相关知识的总结,Mysql利用方式较为灵活,这里总结了一些常用的姿势. 1 0x01 union select注入 http://127.0.0.1/?id ...

  8. Mysql 给你100万条数据的一张表,你将如何分页查询优化?

    1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...

  9. mysql 一对多 根据多条数据排序_优化的道路永无止境——Mysql的ICP及MRR

    在讲ICP和MRR之前,我们先了解一下MySQL的架构.于本文的重点并不在架构细节上,所以让我们直接看关键部分,存储引擎作为单独的一层,是连接底层存储系统和上层server其他部分的桥梁,而MySQL ...

最新文章

  1. TestNG 自动化测试入门教程--典型示例
  2. Hello World!!
  3. 钟国晨160809323 (作业9)
  4. uva 10934—— Dropping water balloons
  5. bzoj3238 [Ahoi2013]差异
  6. liunx 安装 confluent-kafka-go
  7. 快收下这份照片模糊变清晰方法攻略
  8. iweboffice2015库文件WebOffice.js中新增删除两个书签之间的内容实现
  9. TRNSYS与MATLAB联合仿真
  10. 【软件测试管理与实践-软件质量】
  11. MT6573_android_LCD_backlight_Driver
  12. 图扑税务信息化系统管理平台,构建项目管理“一张网”
  13. 使用CacheFS+TmpFS加速NFS读取速度
  14. 微信小程序之实现层叠轮播图的效果案例(前端学习收藏夹必备)
  15. 【操作系统----Linux】Linux作为服务器系统安装过程
  16. 国内沪深股市的股票策略分析的简单案例
  17. Phillip and Trains(dfs专题)
  18. 聊天机器人越来越流行 但如何黏住用户?
  19. 正则表达式re模式(python爬虫糗事百科热点段子)
  20. java小系统 数据库 图书馆

热门文章

  1. R语言绘制社会网络图
  2. MongoDB+集成SpringBoot+索引+并发优化 - 基于《MongoDB进阶与实战:唐卓章》
  3. 一本正经前端的面试清单
  4. 如何在R中绘制热力地图
  5. Opencv腐蚀、膨胀相关参数
  6. 基于Java毕业设计信管专业毕业生就业管理信息系统源码+系统+mysql+lw文档+部署软件
  7. 选择正确的错误度量标准:MAPE与sMAPE的优缺点
  8. C语言程序设计 利用文件保存数据
  9. Android 蓝牙APP设计
  10. Java+GeoTools工具包+读写shapfile文件