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、总结
深度分页往往会带来全表扫描查询慢的问题,我们一定要分析执行计划,要么利用连续分页特性解决问题、要么利用索引扫描来解决问题。