mysql order by 優化與索引的應用

2021-07-11 22:44:53 字數 1666 閱讀 1779

在某些場景,在不做額外的排序情況下,mysql 可以使用索引來滿足 order by 子句的優化。雖然 order by並不完全精確地匹配索引,但是索引還是會被使用,只要在where子句中,所有未被使用的那部分索引(乙個索引多個欄位的情況)以及所有order by欄位都是乙個常量就沒問題。下面這些查詢語句,使用了索引來對 order by部分進行優化:

select * from t1

order by key_part1,key_part2,... ;(注意,類似key_part1、key_part2屬於同乙個聯合索引的字段)

select * from t1

where key_part1 = constant

order by key_part2;

select * from t1

order by key_part1 desc, key_part2 desc;

select * from t1

where key_part1 = 1

order by key_part1 desc, key_part2 desc;

select * from t1

where key_part1 > constant

order by key_part1 asc;

select * from t1

where key_part1 < constant

order by key_part1 desc;

select * from t1

where key_part1 = constant1 and key_part2 > constant2

order by key_part2;

以上查詢語句的order by子句都能夠使用索引進行優化排序效率。然而,在某些場景,雖然在where 子句中依然可用索引去匹配的行,但並不能那麼幸運的使用上索引去對order by子句進行優化。下面這些場景就是這種情況:

這個查詢語句中,order by 的字段是兩個不同的單獨索引:

select * from t1 order by key1, key2;

這個查詢語句中,order by 的字段是聯合索引中兩個不連續的索引字段(大家知道,聯合索引是不能跳開來使用欄位的,例如key(column1,column2)這個聯合索引,column1,

或column1,column2都使用了索引,然而column2是用不了索引的):

select * from t1 where key2=constant order by key_part2;

這個查詢語句中,order by 混合使用了降序desc和公升序asc,也是不行的:

select * from t1 order by key_part1 desc, key_part2 asc;

這個查詢語句中,在where子句中用來檢索匹配行的索引與order by使用的索引不是同乙個索引,也不行:

select * from t1 where key2=constant order by key1;

這個查詢語句中,order by 子句使用了乙個條件表示式不同於索引欄位名稱:

select * from t1 order by abs(key);

select * from t1 order by -key;

MySQL Order By索引優化

mysql order by索引優化 mysql可以直接使用索引來滿足乙個order by 子句而無需做額外的排序。儘管 order by 不是和索引的順序準確匹配,索引還是可以被用到。在一些情況下,mysql可以直接使用索引來滿足乙個 order by 或 group by 子句而無需做額外的排序...

MySQL Order By索引優化

在一些情況下,mysql可以直接使用索引來滿足乙個order by 或group by 子句而無需做額外的排序。儘管order by 不是和索引的順序準確匹配,索引還是可以被用到,只要不用的索引部分和所有的額外的order by 欄位在where 子句中都被包括了。使用索引的mysql order ...

MySQL Order by 語句用法與優化詳解

order by語句是用來排序的,經常我們會使用到order by來進行排序,下面我給大家來講講order by用法與優化排序,有需要的同學可參考 複製 如下 select column name s from table name order by column name 例子 sql建立 複製 ...