在 MySQL 中,ORDER BY
子句是否使用索引取决于多种因素,包括查询的具体情况、索引的类型和结构、查询中的其他条件等。
使用索引的情况 1.单列索引和 ORDER BY:当 ORDER BY 子句中的列有单列索引时,MySQL 可以利用该索引来加速排序。 -- 假设 column 已经有索引 idx_columnSELECT * FROM table ORDER BY column; 2.联合索引和 ORDER BY:当 ORDER BY 子句中的列是联合索引的一部分,并且遵循索引的顺序时,MySQL 可以利用该联合索引来加速排序。 -- 假设有联合索引 idx_columns (column1, column2)SELECT * FROM table ORDER BY column1, column2; 3.WHERE 子句和 ORDER BY:当 WHERE 子句和 ORDER BY 子句使用相同的索引时,MySQL 可以同时利用索引来加速筛选和排序。 -- 假设有联合索引 idx_columns (column1, column2)SELECT * FROM table WHERE column1 = 'value' ORDER BY column2;
不使用索引的情况 1.无索引的列:如果 ORDER BY 子句中的列没有索引,MySQL 需要进行全表扫描并排序,这无法利用索引。SELECT * FROM table ORDER BY column_without_index; 2.不同索引的列:如果 ORDER BY 子句中的列不是联合索引的一部分,或者列的顺序不符合联合索引的顺序,MySQL 无法利用索引进行排序。 -- 假设有联合索引 idx_columns (column1, column2)SELECT * FROM table ORDER BY column2, column1; -- 不能利用索引 3.混合升降序:如果 ORDER BY 子句中包含的列排序方向不一致,MySQL 无法利用联合索引。 -- 假设有联合索引 idx_columns (column1, column2)SELECT * FROM table ORDER BY column1 ASC, column2 DESC; -- 不能利用索引 4.计算列或函数:如果 ORDER BY 子句中使用了计算列或函数,MySQL 无法利用索引。SELECT * FROM table ORDER BY LENGTH(column); -- 不能利用索引
来源:https://blog.csdn.net/Gemini1995/article/details/140319879