MySQL的ORDER BY排序优化

本文探讨了数据库索引设计的重要性,强调了索引在ORDER BY子句中的优化作用。当索引顺序与ORDER BY字段顺序一致且方向相同,同时包含所需行时,可以有效利用索引进行排序。举例说明了不同情况下索引是否被利用的情况,包括正向排序、反向排序以及主键列的查找。此外,还提到了前导列为常量时的特殊情况,以及在多表查询中索引排序的条件。了解这些原则对于提升数据库查询性能至关重要。
摘要由CSDN通过智能技术生成

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

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的字段必须全部是第一个表的字段,并满足上述原则,才能使用索引来对结果排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值