- 数据表的排序操作是指数据库在执行过程中,先将满足条件的数据全部读出来,放入内存中,再执行快排,这个内存就是sort_buffer。如果临时数据量比sort_buffer大, 就要把数据放入临时文件,然后做外部排序,可见这个排序过程的消耗是比较大的。
- 有序索引排序是通过创建索引来实现排序的一种方法。利用索引中最左匹配原则下的有序性排序,可以避免在查询时执行 order by 操作,在排序执行过程中不使用快排或外部排序,从而提高查询效率。因此要使用索引排序,也需要满足最左匹配原则
- 具体实现方法是在创建索引时,将要排序的列作为索引的一部分,并指定索引的排序方式。例如,可以创建一个升序索引或降序索引。
示例
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
age int(11) NOT NULL,
PRIMARY KEY (id),
KEY `name_age_idx` (name, age)
)
SELECT * FROM user
ORDER BY name, age;
- 默认情况下,只有当索引的列顺序和order by子句顺序完全一致,并且所有列的排序方向都一样时,MySQL才能用索引来对结果做排序。也就是说混合升序(ASC)降序(DESC)的查询不会使用索引进行排序
示例
SELECT * FROM user
ORDER BY name ASC, age DESC;
- 上述查询只有 name 使用了索引,而 age 会进行文件排序(filesort)
注
- 如果查询需要关联多张表,则只有当 order by 子句引用的字段全为第一个表时,才能使用索引做排序。
- 有序索引排序并不是适用于所有情况的最佳方法。对于一些复杂的查询,可能需要在查询中使用order by操作来实现所需的排序。因此,在使用有序索引排序时,需要根据具体情况进行权衡和选择。