MySQL的ORDER BY排序优化

索引设计时,尽量满足既能满足排序,又能查找行。

ORDER BY优化时尽量使用索引排序。

只有当索引列的顺序和ORDER BY的字段顺序一致,排序方向也一致,并且索引包含要查找的行,满足最左前缀原则,才能使用索引来对结果排序。

例如给student表建立联合索引NAME, AGE, CLASS

CREATE TABLE `student` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(30) NOT NULL,
  `SEX` char(2) NOT NULL,
  `AGE` int(11) NOT NULL,
  `CLASS` varchar(10) NOT NULL,
  `GRADE` varchar(20) NOT NULL,
  `HOBBY` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `index_t` (`NAME`,`AGE`,`CLASS`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

如下sql能使用索引排序,Extra列没有Using filesort

EXPLAIN SELECT `NAME`, `AGE`, `CLASS` FROM student ORDER BY `NAME`, `AGE`, `CLASS`

在这里插入图片描述
排序方向不一致时,不能使用索引排序

EXPLAIN SELECT `NAME`, `AGE`, `CLASS` FROM student ORDER BY `NAME`, `AGE`, `CLASS` DESC

在这里插入图片描述

查找主键列时,主键列属于被索引列包含的范围

EXPLAIN SELECT `ID`,`NAME`, `AGE`, `CLASS` FROM student ORDER BY `NAME`, `AGE`, `CLASS`

在这里插入图片描述

有一种情况可以不满足最左前缀原则,那就是前导列为常量时。
如下SQL用到了索引排序

SELECT * FROM student WHERE NAME='tom' ORDER BY AGE,CLASS

在这里插入图片描述
如果是多表关联查询,则ORDER BY的字段必须全部是第一个表的字段,并满足上述原则,才能使用索引来对结果排序。

猜你喜欢

转载自blog.csdn.net/weixin_43073775/article/details/121289370