mysql索引 order by . group by

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

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

explain 查看索引执行情况

id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE table range id id 4 null 578608 Using index condition; Using filesort

2.DMLsql语句:

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

explain 查看索引执行情况

id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE table range id id 4 null 578608 Using index condition

3.DML sql语句

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

explain 查看索引执行情况

id select_type table type possible_keys key key_len ref rows extra
1 SIMPLE table index c_t PRIMARY 4 null 2886 Using 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等。

猜你喜欢

转载自blog.csdn.net/weixin_40786663/article/details/89432836