赞
踩
1.DMLsql语句:
select 查询字断 from 表名 where id > 10 order by c_t desc
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
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
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 |
俩个sql差别在order by 后面的字段,order by的字段不在where条件 里,即使是查询走了索引,也会在排序的时候用查询的结果去在全表中排序,结果就导致全表扫描,其实相当于没走索引,相反,order by的字段在where条件 里在查询之后不会在进行排序
如果表的数据是有序的,sort排序花费的时间较少。如果是个比较无序的表,sort时间就会增加很多了。排序操作一般都是在内存里进行的,对于数据库来说是一种CPU的消耗,由于现在CPU的性能增强,对 于普通的几十条或上百条记录排序对系统的影响也不会很大。但是当你的记录集增加到上百万条以上时,这么做了,大记录集排序不仅增加了 CPU开销,而且可能会由于内存不足发生硬盘排序的现象,当发生硬盘排序时性能会急剧下降。
当order by 字段出现在where条件中时,才会利用索引而无需排序操作。其他情况,order by不会出现排序操作。
有排序操作
select 查询字断 from 表名 where id > 10 order by c_t desc
select 查询字断 from 表名 where id > 10 order by c_t ,id desc
无排序操作
select 查询字断 from 表名 where id > 10 order by id desc
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等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。