MySQL排序(Order By)为什么要使用索引

时间:2024-05-23 16:38:18

目录

 

MySQL排序(Order By)为什么要使用索引

1. WHERE条件句中使用索引

创建索引

不选择索引字段做条件查询

使用索引字段作为条件查询

对比结论

2. Order By 使用索引

创建索引

不使用索引字段

使用索引字段

结论 


MySQL排序(Order By)为什么要使用索引

1. WHERE条件句中使用索引

以查询一条程咬金 记录为例:

MySQL排序(Order By)为什么要使用索引

创建索引

先创建一个二级索引

MySQL排序(Order By)为什么要使用索引

 

不选择索引字段做条件查询

MySQL排序(Order By)为什么要使用索引

MySQL排序(Order By)为什么要使用索引

 

  • key=null 执行计划中没有用到索引
  • rows=69 全表扫描

使用索引字段作为条件查询

MySQL排序(Order By)为什么要使用索引

MySQL排序(Order By)为什么要使用索引

 

  • key=name_index 使用到索引name_index
  • rows=1 

对比结论

  1. 在选条件语句中不加索引字段,索引会失效,包括聚簇索引。
  2. 使用的索引避免了全表扫描

2. Order By 使用索引

众所周知,为了避免全表扫描,条件句中增加了索引,上面性能对比一目了然。可是为什么要在Order By排序中也要使用索引字段呢?

创建索引

先创建一个二级索引hp_start_index

MySQL排序(Order By)为什么要使用索引

不使用索引字段

MySQL排序(Order By)为什么要使用索引

  • 选择字段中有创建的二级索引字段name
  • key=null 没有使用到索引
  • rows=69 全表扫描
  • using filessort

使用索引字段

MySQL排序(Order By)为什么要使用索引

  •  key=hp_start_index 使用到了索引
  • rows=3非全表扫描
  • Using index condition; Backward index scan

Order By有两种排序方法

  1.  Backward index scan:使用索引扫描。索引本身就是有序的,所以不需要再次进行排序
  2. using filessort:在内存中排序,占用CPU资源。如果查询结果太大还会产生临时文件,到磁盘中进行排序,这时候会进行大量IO操作性能较差

其实这个SQL是分三步来执行的:

  1. where得到数据
  2. Order By处理数据(排序)看第一部执行计划是不是用到索引,如果用到了就可以直接获得索引的顺序,从而避免再次排序。如果没用到就做排序(using filessort)。
  3. 返回数据

结论 

  • Order By语句只有使用了跟WHERE语句中相同的索引字段,Order By中的索引才会生效
  • Order By中使用索引可避免重新排序导致CPU资源浪费

MySQL排序(Order By)为什么要使用索引