mysql大表的深度分页慢sql案例(跳页分页)-2

时间:2024-06-01 14:52:08

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、总结

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