Mysql索引掃瞄排序

2021-07-22 08:48:37 字數 1430 閱讀 5819

mysql有兩種操作可以用來生成有序結果:

+排序操作: 將查詢出來的結果使用排序演算法進行排序

+按索引順序掃瞄order by語句後跟著乙個被索引的列,如此一來索引的順序就是索引對應記錄的順序,這樣直接順著索引一直往下讀取記錄即可得到有序的結果。

按照索引順序掃瞄的好處是不言而喻的,因為查詢出來的結果就是有序結果而無需執行額外的排序操作,這樣執行的速度就會相對較快。但是,不是什麼時候按照索引掃瞄的執行速都會是最快的。雖然掃瞄索引的速度是非常快的,但是如果索引不能覆蓋到查詢所需要的所有資料列的話,這種情況下每掃瞄乙個索引就必須相對應地回表一次,這樣的io幾乎是隨機io,如此一來雖然索引掃瞄無需執行一次排序演算法,但是隨機io操作會大大拖慢執行速度,導致按照索引掃瞄的執行速度反而要比排序操作要慢。因此,在考慮使用按照索引掃瞄的方式去獲得有序結果,那麼設計索引時必須要考慮索引覆蓋的情況

有一張表rental如下所示:

create

table rental;

執行語句:

explain select rental_id, staff_id from sakila.rental 

-> where rental_date = '2005-05-5'

-> order

by inventory_id, customer_id\g

輸出為:

possible_keys: rental_date

key: rental_date

rows: 1

extra: using where

這裡看到extra: using where而不是extra: using filesort表明此次查詢並沒有排序操作,而是直接通過掃瞄索引獲得有序結果。因為這在這裡,雖然order by語句的字段並沒有滿足最左字首的原則,但是由於前導列只定了乙個常量,所以可以使用索引掃瞄進行排序。

將上述查詢改為以下語句也沒問題:

explain select rental_id, staff_id from sakila.rental 

-> where rental_date > '2005-05-5'

-> order

by rental_date, inventory_id, customer_id\g

因為這裡雖然沒有將前導列指定為常量,但是這裡order by的語句滿足了最左字首原則。

下列語句不能使用掃瞄索引得到有序結果:

mysql優化之索引掃瞄排序

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

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

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

MySQL 使用索引掃瞄來做排序

mysql有兩種方式可以生成有序的結果 通過排序操作 或者按照索引順序掃瞄 如果explain 出來的結果的type列的值為 index 則說明mysql使用了索引掃瞄來做排序 不要和extra列的 using index 搞混 掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄...