mysql索引 order by . group by不走索引导致扫全表

mysql 用order by不走索引导致全表扫描

1.DMLsql语句:
select 查询字断 from 表名 where id > 10 order by c_t desc

explain 查看索引执行情况

idselect_typetabletypepossible_keyskeykey_lenrefrowsextra
1SIMPLEtablerangeidid4null578608Using index condition; Using filesort

2.DMLsql语句:

select 查询字断 from 表名 where id > 10 order by id desc

explain 查看索引执行情况

idselect_typetabletypepossible_keyskeykey_lenrefrowsextra
1SIMPLEtablerangeidid4null578608Using index condition

3.DML sql语句

select 查询字断 from 表名 where c_t > 1555862400 group by id limit 20

explain 查看索引执行情况

idselect_typetabletypepossible_keyskeykey_lenrefrowsextra
1SIMPLEtableindexc_tPRIMARY4null2886Using where

Using filesort —>排序

俩个sql差别在order by 后面的字段,order by的字段不在where条件 里,即使是查询走了索引,也会在排序的时候用查询的结果去在全表中排序,结果就导致全表扫描,其实相当于没走索引,相反,order by的字段在where条件 里在查询之后不会在进行排序
如果表的数据是有序的,sort排序花费的时间较少。如果是个比较无序的表,sort时间就会增加很多了。排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。

排序操作 order by

当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
有排序操作

  1. order by后面的字段不在where条件

select 查询字断 from 表名 where id > 10 order by c_t desc

  1. order by后面的字段在where条件但是排在后面

select 查询字断 from 表名 where id > 10 order by c_t ,id desc

无排序操作

  1. order by后面的字段在where条件(正序/倒序)

select 查询字断 from 表名 where id > 10 order by id desc

  1. order by后面的字段不全在where条件(正序/倒序)

select 查询字断 from 表名 where id > 10 order by id,c_t asc

总结

一条SQL实际上可以分为三步。
1.得到数据 2.处理数据 3.返回处理后的数据
比如上面的这条语句 select 查询字断 from 表名 where id > 10 order by c_t desc
第二步:将得到的数据排序。
当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。
第三步:返回排序后的数据。
当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则排序操作。

当order by 中的字段出现在where条件中时,才会利用索引而不排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。
这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值