MySQL 使用索引掃瞄來做排序

2022-07-26 19:54:13 字數 627 閱讀 2529

mysql有兩種方式可以生成有序的結果:通過排序操作;或者按照索引順序掃瞄;如果explain 出來的結果的type列的值為「index」,則說明mysql使用了索引掃瞄來做排序(不要和extra列的「using index」搞混)。

掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄。但如果索引不能覆蓋查詢所需要的全部列,那就不得不沒掃瞄一條索引記錄就回表查詢一次對應的行。這基本上都是隨機的io,因此按索引順序讀取資料的速度通常要比順序的全表掃瞄慢,尤其是在io密集型的工作負載時。

mysql可以使用同乙個索引既滿足排序,又用於查詢行。因此,如果可能,設計索引時應該盡可能地同時滿足這兩種任務,這樣是最好的。

只有當索引的列順序和order by 子句的順序完全一致,並且所有列的排序方向(倒序或正序)都一致時,mysql才能使用索引來對結果做排序。如果查詢需要關聯多張表,則只有當order by 子句引用的字段全部為第乙個表時,才能使用索引做排序。order by子句和查詢型查詢的限制是一樣的:需要滿足索引的最左綴的要求,否則,mysql都需要執行排序操作,而且無法利用索引排序。

有一種情況下order by 子句可以不滿足最左字首的要求,就是前導列為常量的時候。如果where 子句或者join子句中對這些列指定了常量,就可以彌補索引的不足。  

使用索引掃瞄來做排序 mysql索引優化

mysql有兩種方式可以生成有序的結果 通過排序操作或者按索引順序掃瞄,如果explain出來的type列的值為index,則說明mysql使用了索引掃瞄來做排序 掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄。但如果索引不能覆蓋查詢所需的全部列,那麼就不得不每掃瞄一條索引記...

mysql索引 之使用索引掃瞄做排序

今天看了 高效能mysql 的索引掃瞄做排序章節,並且親身實踐了一下,發現有些結果與原書不一樣,個人猜測是mysql版本不一樣造成的,下面分享一下我個人的筆記。mysql 有兩種方式生成有序結果 通過排序操作或者按索引順序掃瞄。如果explain出來type列的值為index,則說明mysql使用索...

Mysql索引掃瞄排序

mysql有兩種操作可以用來生成有序結果 排序操作 將查詢出來的結果使用排序演算法進行排序 按索引順序掃瞄 order by語句後跟著乙個被索引的列,如此一來索引的順序就是索引對應記錄的順序,這樣直接順著索引一直往下讀取記錄即可得到有序的結果。按照索引順序掃瞄的好處是不言而喻的,因為查詢出來的結果就...