order by日期造成的全表扫描sql优化

前言

大多项目中查询都是通过分页+日期字段排序的一种方式,而最近遇到一个慢sql查询,带where条件不慢,单查询按照日期排序就耗时慢,直接上执行计划分析
在这里插入图片描述
截图中发现是走了全表扫描的,而且order by是显示sort order by,解释一下就是先把表排个序,然后取出20条。想想这样的方式傻吗? 假如表2000W甚至几个亿怎么办?所以这样的方式不能取,换句话说这里面的表应该是走索引。


排查思路

  1. 加索引试试看
create index test_index on test(CREATED_DATE);
  1. 加了后索引效果并不明显,后来看到日期字段有部分null值,删除索引重新新建,注意这里索引加了个常数,具体为什么是因为索引不能储存NULL值,或者把字段设置成IS NOT NULL.
create index test_index on test(CREATED_DATE,0);
  1. 加索引后效率秒查,看下执行计划
    在这里插入图片描述
  2. 注意看sort order by已经变成了COUNT STOPKEY,而且行数有全表数据变为了10行,秒查出来

总结

下面我们来总结下单表分页优化的重点

  1. 表要走索引
  2. 执行计划中要出现COUNT STOPKEY,不能出现SORT ORDER BY
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值