当前位置:首页> 行业快讯 >

MySQL百万数据深度分页优化思路分析_天天快消息

时间:2023-05-09 14:42:35    来源:博客园
业务场景

一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万、千万条数据只是时间问题。

瓶颈再现

创建了一张user表,给create_time字段添加了索引。并在该表中添加了100w条数据。

我们这里使用limit分页的方式查询下前5条数据和后5条数据在查询时间上有什么区别。


【资料图】

查询前10条基本上不消耗什么时间

我们从第50w+开始取数据的时候,查询耗时1秒。

SQL_NO_CACHE 这个关键词是为了不让SQL查询走缓存。

同样的SQL语句,不同的分页条件,两者的性能差距如此之大,那么随着数据量的增长,往后页的查询所耗时间按理会越来越大。

问题分析回表

我们一般对于查询频率比较高的字段会建立索引。索引会提高我们的查询效率。我们上面的语句使用了SELECT * FROM user,但是我们并不是所有的字段都建立了索引。当从索引文件中查询到符合条件的数据后,还需要从数据文件中查询到没有建立索引的字段。那么这个过程称之为回表

覆盖索引

如果查询的字段正好创建了索引了,比如 SELECT create_time FROM user,我们查询的字段是我们创建的索引,那么这个时候就不需要再去数据文件里面查询,也就不需要回表。这种情况我们称之为覆盖索引

IO

回表操作通常是IO操作,因为需要根据索引查找到数据行后,再根据数据行的主键或唯一索引去聚簇索引中查找具体的数据行。聚簇索引一般是存储在磁盘上的数据文件,因此在执行回表操作时需要从磁盘读取数据,而磁盘IO是相对较慢的操作。

LIMTI 2000,10 ?

你有木有想过LIMIT 2000,10会不会扫描1-2000行,你之前有没有跟我一样,觉得数据是直接从2000行开始取的,前面的根本没扫描或者不回表。其实这样的写法,一个完整的流程是查询数据,如果不能覆盖索引,那么也是要回表查询数据的。

现在你知道为什么越到后面查询越慢了吧!

问题总结

我们现在知道了LIMIT 遇到后面查询的性能越差,性能差的原因是因为要回表,既然已经找到了问题那么我们只需要减少回表的次数就可以提升查询性能了。

解决方案

既然覆盖索引可以防止数据回表,那么我们可以先查出来主键id(主键索引),然后将查出来的数据作为临时表然后 JOIN原表就可以了,这样只需要对查询出来的5条结果进行数据回表,大幅减少了IO操作。

优化前后性能对比

我们看下执行效果:

优化前:1.4s

优化后:0.2s

查询耗时性能大幅提升。这样如果分页数据很大的话,也不会像普通的limit查询那样慢。

标签:

关于郭涛等7名同志拟任职的公示

根据《党政领导干部选拔任用工作条例》和有关规定,现将拟任职干部情况公示如下,请予监督:郭涛,1972年3月生,大学,管理学博士,中共党

2022-05-19

河南疫情最新消息|5月18日河南新增本土确诊病例11例、本土无症状感染者9例

5月18日0—24时,全省新增本土确诊病例11例(许昌市11例),新增本土无症状感染者9例(郑州市4例,许昌市4例,鹤壁市1例),无新增本土疑似

2022-05-19

安阳、焦作……河南三市发布最新人事信息

安阳市人民代表大会常务委员会任免名单(2022年5月17日安阳市第十四届人民代表大会常务委员会第三十四次会议通过)(一)决定免去:马卫安

2022-05-19

注意!沪陕高速信阳叶信段即将施工 通行请小心

记者从信阳高速公路公安交通警察支队了解到,2022年5月23日6时至8月31日22时,沪陕高速信阳叶信段(K764至K85)北幅,将分阶段、分路段进行

2022-05-19

@千万郑州人,今后非机动车违法采取新办法,需现场朗读“承诺书”

5月18日,记者从郑州交管局获悉,近日,郑州交警在查处非机动车、电动车等交通违法时,通过依法依规处罚、现场学习交通法规,扫码下载朗读

2022-05-19

4月河南物价水平保持温和上涨

据国家统计局河南调查总队数据显示,4月份全省居民消费价格同比上涨1 6%,涨幅比上月扩大0 6个百分点;1-4月,全省居民消费价格同比上涨0 8

2022-05-19

被车评人集体声讨的保时捷终于妥协:免费恢复功能,延保一年

5月18日,针对带电动调节功能转向柱减配事件,保时捷中国公布解决方案。保时捷中国方面表示,针对此前承诺过恢复转向柱电动调节功能的客户

2022-05-19

郑州市经开区率先部署15分钟核酸检测“采样圈” 记者实探经北一路核酸采样工作站

医护人员不用穿成大白,呆在凉爽的小屋里就能完成核酸采样;而市民也不用担心飞沫传染,就近来到小屋前就能迅速进行核酸检测。5月17日上午

2022-05-19

以身挡落石,郑州新密消防员18米深井救人

5月15日17时31分,郑州市消防救援支队新密大队指挥中心接到群众报警,一名男子坠入该市矿区总医院后院围墙外18米深井内,身体受伤无法动弹

2022-05-19

2022年郑州市中招政策发布:6月22日—24日考试,总分600分

5月17日上午,郑州市教育局召开2022年郑州市中招工作会议,并进行新闻发布。今年,郑州市中招考试时间为6月22日-24日,由于今年取消了中招

2022-05-19