这句sql能怎么优化,三十多万记录,查询时间要2秒,肯定有问题
SELECT * from (SELECT ROW_NUMBER() over(order by ot.IsEnd asc,ot.AddTime desc) as rownum ,em.Id as emId FROM OngoingTask ot ) t
where t.rownum between 120 and 130
其中IsEnd是int类型,0,1,2,3,代表任务状态,IsEnd与AddTime 都添加了索引。
首先 30w条记录 如果全表查询 就是2秒 这个没有问题(去掉缓存的情况下 因为从硬盘上要读出这么多数据大致要花这么多时间)
其次 如果查询字段是索引 另说
查一下 有没有聚集索引
然后 如果可以 你的排序索引吧 id也加进去 试试
sql的查询 优先查询索引 如果返回值包含索引外的 字段那么会根据 当前索引指定的位置 去读相关记录
执行计划排序占用了94%,IsEnd字段的聚集索引扫描占了6%,去掉IsEnd字段排序,搜索就非常快,这个字段建立索引好像也没啥用
@sujiaya: 想起来了 如果数据里面是大量的重复 数据 就没必要建立索引
@小眼睛老鼠: 恩,是啊,头疼,
@sujiaya: 我知道啦,哈,创建联合索引就行啦,谢谢,结贴
建议看一下执行计划
执行计划排序占用了94%,IsEnd字段的聚集索引扫描占了6%,去掉IsEnd字段排序,搜索就非常快,这个字段建立索引好像也没啥用
@sujiaya: 如果聚集索引建在AddTime字段上,可以大幅降低排序的开销。
@dudu: 恩,我知道,但是IsEnd这个排序很必要,就是要把未完成的任务排在前面,有什么好的解决思路吗