前言
大多项目中查询都是通过分页+日期字段排序的一种方式,而最近遇到一个慢sql查询,带where条件不慢,单查询按照日期排序就耗时慢,直接上执行计划分析
截图中发现是走了全表扫描的,而且order by是显示sort order by,解释一下就是先把表排个序,然后取出20条。想想这样的方式傻吗? 假如表2000W甚至几个亿怎么办?所以这样的方式不能取,换句话说这里面的表应该是走索引。
排查思路
- 加索引试试看
create index test_index on test(CREATED_DATE);
- 加了后索引效果并不明显,后来看到日期字段有部分null值,删除索引重新新建,注意这里索引加了个常数,具体为什么是因为索引不能储存NULL值,或者把字段设置成IS NOT NULL.
create index test_index on test(CREATED_DATE,0);
- 加索引后效率秒查,看下执行计划
- 注意看sort order by已经变成了COUNT STOPKEY,而且行数有全表数据变为了10行,秒查出来
总结
下面我们来总结下单表分页优化的重点
- 表要走索引
- 执行计划中要出现COUNT STOPKEY,不能出现SORT ORDER BY