为order by使用索引

作者: 编程界的小学生 | 来源:发表于2017-03-10 21:44 被阅读417次

此篇文章主要是解决Order by带来Using filesort的问题

1、创建表

CREATE TABLE tblA(
    #id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    age INT,
    birth TIMESTAMP NOT NULL
);

INSERT INTO tblA(age, birth) VALUES(22, NOW());
INSERT INTO tblA(age, birth) VALUES(23, NOW());
INSERT INTO tblA(age, birth) VALUES(24, NOW());

CREATE INDEX indx_A_ageBirth ON tblA(age, birth);

SELECT * FROM tblA;

2、看如下几组SQL:
(一)
EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age;

Paste_Image.png

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age, birth;

Paste_Image.png

带头大哥age一直在,所以不会产生Using filesort,因为从火车头开始,而order by正好也是从火车头开始,age索引可以用上。

(二)

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth;

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth, age;
Paste_Image.png

带头大哥age不再order by范围内了,前面where条件还是大于号(范围值),索引断了,所以排序的时候无法用到索引,产生了Using filesort

(三)

EXPLAIN SELECT * FROM tblA ORDER BY birth;

EXPLAIN SELECT * FROM tblA WHERE birth > '2011-11-11 11:11:11' ORDER BY birth;
Paste_Image.png

带头大哥age完全没用上

(四)
EXPLAIN SELECT * FROM tblA WHERE birth > '2011-11-11 11:11:11' ORDER BY age;

Paste_Image.png

不难发现,我order by用到了带头大哥age,索引不会产生Using filesort

(五)

EXPLAIN SELECT * FROM tblA ORDER BY age ASC, birth DESC;
EXPLAIN SELECT * FROM tblA ORDER BY age DESC, birth ASC;
Paste_Image.png

(六)

EXPLAIN SELECT * FROM tblA ORDER BY age ASC, birth ASC;
EXPLAIN SELECT * FROM tblA ORDER BY age DESC, birth DESC;
Paste_Image.png

从(五)和(六)可知,排序的话要么都升序,要么都降序,否则mysql内部会不知道怎么排序,排序也是索引的一部分(Btree),所以不一致时会产生Using filesort

(七)
EXPLAIN SELECT * FROM tblA WHERE age = 20 ORDER BY birth;

Paste_Image.png

这就神奇了,居然没有Using filesort,是因为where 条件是个常量,而不是个范围,所以会自动传递到order by,所以order by带头大哥还是age

总结

Paste_Image.png

重要

Paste_Image.png

Group By关键字优化

Paste_Image.png

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg

相关文章

  • 为order by使用索引

    此篇文章主要是解决Order by带来Using filesort的问题 1、创建表 2、看如下几组SQL:(一)...

  • MySQL ORDER BY是如何执行的

    本文问题 order by是否可以使用索引,在什么情况下使用索引? 在哪些情况下,order by无法使用索引执行...

  • C++面经 ——数据库查询优化的方法

    使用索引尽量避免全局搜索,为经常被order where 、by、ground by的检索的字段建立索引。 优化s...

  • sql优化

    优化查询基础 为所有的join,where,order by和group by 中的条件简历索引 避免在条件中使用...

  • 开发提问03索引

    索引优化的方案 使用explain分析语句针对常用的where , order by 字段添加索引不要使用超过3个...

  • Geomesa学习2 - 索引机制

    GeoMesa一共有两大类索引,分别是普通属性索引、时空索引。 Geomesa时空索引使用了基于Z-order填充...

  • MySQL优化:order by和limit

    1. 对order by使用复合索引 order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的...

  • MySQL优化:order by和limit

    1. 对order by使用复合索引 order by和limit一起使用,避免引起全表扫描和数据排序是非常重要的...

  • MySQL最佳实践

    索引使用策略及优化 创建索引 在经常查询而不经常增删改操作的字段加索引。 order by与 group by 后...

  • mysql-为排序使用索引order by,group by

    一.排序原则的纲领 二.case case1 order by使用索引,的关键就看,是否产生了Using file...

网友评论

  • 泉百:第(六)组的explain结果有一定误导性,type=index 且Extra=Using index的原因不是因为order by命中了索引,而是因为age和birth刚好是覆盖索引,因为你的表除了id就只有这两列,否则select *肯定是Using filesort,不管你order by有没有命中索引,是否能索引排序是依赖上一步的条件执行是否命中索引的

本文标题:为order by使用索引

本文链接:https://www.haomeiwen.com/subject/qrmogttx.html