1 背景
有一张大表,内容是费用明细表,数据量约700万级, 普通B+树索引KEY `idx_fk_fymx_qybh_xfsj` (`qybh`,`xfsj`)。
1.1 原始深度分页sql
select t.* from fk_fymx t where t.qybh ='XXXXXXX' limit 100000,100;
深度分页会导致加载数据行过多100000+100=100100行,磁盘IO代价过高比较慢
1.2 原始深度分页sql执行耗时
共耗时 1m2s
2、解决方案
2.1 优化之后sql
select t.* from fk_fymx t,(select id from fk_fymx where qybh ='xxxxxx' limit 100000,100) t2 where t.id = t2.id
采用延迟关联的方式进行处理,减少SQL回表,但是要记得索引需要完全覆盖才有效果,SQL改动如下:充分利用索引覆盖的特性,扫描索引结构,避免全表扫描。
2.2 优化之后sql执行耗时
45ms
3、总结
深度分页往往会带来全表扫描查询慢的问题,我们一定要分析执行计划,要么利用连续分页特性解决问题、要么利用索引扫描来解决问题。