参考链接:https://blog.csdn.net/weixin_36380516/article/details/120520705
背景
近期,随着我们系统数据量的快速增长,达到 40w 左右,一个导出全量花名册的功能造成了 SQL 慢查询,该功能调用的是一个分页查询的接口,每一页 20 条数据。我们的分页查询用的是自定义分页插件,底层数据库操作实现为常见的 limit pageNo,pageSize,当进行深分页时就很容易造成慢 SQL,比如达到 ** limit 300000,20**
分析
深分页为什么会变慢
- limit 语句会先扫描 offset+n 行,然后再丢弃掉前 offset 行,返回后 n 行数据。也就是说 limit 100000,10,就会扫描 100010 行,而 limit 0,10,只扫描 10 行。
- limit 100000,10 扫描更多的行数,也意味着回表更多的次数。
解决
减少回表的次数
通过分析,知道深分页慢的原因主要是回表次数过多导致,那减少回表的次数即可。
InnoDB 中,索引分主键索引(聚簇索引)和二级索引
- 主键索引,叶子节点存放的是整行数据
- 二级索引,叶子节点存放的是主键的值。
将普通索索引的查询转化为主键的查询,这样一来便可以减少回表的次数。