MySQL排序(Order By)为什么要使用索引
MySQL排序(Order By)为什么要使用索引1. WHERE条件句中使用索引以查询一条程咬金 记录为例:创建索引先创建一个二级索引不选择索引字段做条件查询key=null 执行计划中没有用到索引rows=69 全表扫描使用索引字段作为条件查询key=name_index 使用到索引name_indexrows=1对比结论在选条件语句中不加索引字段,索引会失效,包括聚簇索引。使用的索引避免了全
·
目录
MySQL排序(Order By)为什么要使用索引
1. WHERE条件句中使用索引
以查询一条程咬金 记录为例:
创建索引
先创建一个二级索引
不选择索引字段做条件查询
- key=null 执行计划中没有用到索引
- rows=69 全表扫描
使用索引字段作为条件查询
- key=name_index 使用到索引name_index
- rows=1
对比结论
- 在选条件语句中不加索引字段,索引会失效,包括聚簇索引。
- 使用的索引避免了全表扫描
2. Order By 使用索引
众所周知,为了避免全表扫描,条件句中增加了索引,上面性能对比一目了然。可是为什么要在Order By排序中也要使用索引字段呢?
创建索引
先创建一个二级索引hp_start_index
不使用索引字段
- 选择字段中有创建的二级索引字段name
- key=null 没有使用到索引
- rows=69 全表扫描
- using filessort
使用索引字段
- key=hp_start_index 使用到了索引
- rows=3非全表扫描
- Using index condition; Backward index scan
Order By有两种排序方法
- Backward index scan:使用索引扫描。索引本身就是有序的,所以不需要再次进行排序
- using filessort:在内存中排序,占用CPU资源。如果查询结果太大还会产生临时文件,到磁盘中进行排序,这时候会进行大量IO操作性能较差
其实这个SQL是分三步来执行的:
- where得到数据
- Order By处理数据(排序)看第一部执行计划是不是用到索引,如果用到了就可以直接获得索引的顺序,从而避免再次排序。如果没用到就做排序(using filessort)。
- 返回数据
结论
- Order By语句跟WHERE语句中都用了索引字段,Order By中的索引才会生效
- Order By中使用索引可避免重新排序导致CPU资源浪费
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)