在 MySQL 中,ORDER BY
子句是否使用索引取決於多種因素,包括查詢的具體情況、索引的型別和結構、查詢中的其他條件等。
使用索引的情況 1.單列索引和 ORDER BY: 當 ORDER BY 子句中的列有單列索引時,MySQL 可以利用該索引來加速排序。 -- 假設 column 已經有索引 idx_column SELECT * 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