自学内容网 自学内容网

【MySQL】索引排序

在执行 SQL 查询时,如果 ORDER BY 子句中指定的排序列上存在合适的索引,MySQL 可以直接利用该索引的顺序来返回排序后的结果,而不需要额外的排序操作。这种方式可以大大提高查询性能,因为避免了在内存或磁盘上对数据进行额外的排序。

索引在数据库中是一种特殊的数据结构,通常是按照键值(索引列)的顺序存储的。当我们在某一列上创建了索引,这些索引值实际上是有序排列的。因此,当查询需要按照这个列进行排序时,数据库可以直接按照索引的顺序读取数据,而不需要再对结果集进行排序。

MySQL 索引类似于书籍的索引,通过存储指向数据行的指针,可以快速定位和访问表中的特定数据。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

(菜鸟教程:https://www.runoob.com/mysql/mysql-index.html)

要使 MySQL 能够利用索引进行排序,需要满足以下条件:

  1. 排序的列上有索引ORDER BY 中的列必须有索引。
  2. 索引的顺序与排序的顺序一致:如果索引是升序的,那么 ORDER BY 也需要是升序,反之亦然。
  3. 索引列的顺序匹配:对于多列排序,索引的列顺序需要与 ORDER BY 中的列顺序一致。
  4. 查询中的条件不破坏索引的有序性:例如,不应在排序列上进行函数操作或类型转换。

单列排序利用索引

假设有一个用户表 users,并在 age 列上创建了索引:

CREATE INDEX idx_age ON users(age);

执行以下查询:

SELECT * FROM users ORDER BY age;

由于 age 列上有索引,MySQL 可以利用该索引的顺序直接返回排序后的结果,无需额外排序。

多列排序利用联合索引

如果需要按多个列排序,例如先按 last_name,再按 first_name,可以创建联合索引:

CREATE INDEX idx_name ON users(last_name, first_name);

执行查询:

SELECT * FROM users ORDER BY last_name, first_name;

因为索引的列顺序与 ORDER BY 中的列顺序一致,MySQL 可以利用该联合索引进行排序。

利用索引排序的优势:
  • 性能提升:避免了额外的排序操作,减少了 CPU 和内存的消耗。
  • 效率提高:直接从有序的索引中获取数据,加快了查询速度。
注意事项
  • 索引方向:默认情况下,索引是升序的。如果需要降序排序,必须在索引创建时指定或确保 MySQL 能自动优化。
  • 覆盖索引:如果查询的所有列都在索引中,可以实现索引覆盖,进一步提高性能。
  • 避免破坏索引顺序的操作:在排序列上避免使用函数、算术运算或类型转换,这些操作会使索引失效。
如何确认是否利用了索引排序

使用 EXPLAIN 命令查看查询的执行计划:

EXPLAIN SELECT * FROM users ORDER BY age;

在输出中,如果 Extra 列没有出现 Using filesort,则表示利用了索引进行排序。


原文地址:https://blog.csdn.net/2404_87410060/article/details/143009478

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!