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 搞混 掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄...