1. 程式人生 > >MYSQL的檔案排序(filesort)和索引排序

MYSQL的檔案排序(filesort)和索引排序

什麼時候會發生filesort 排序呢
查詢索引和order by 的欄位不是同一個欄位。比如
select * from table where id > 0 order by name;
注意:我們可以通知查詢優化器按照我們的邏輯去執行索引,那麼上面的sql如果我們調整為
select * from table use index (idx_id) where id > 0 order by name;
其中,idx_name是name的索引,那麼查詢索引和order by指的還是同一個欄位,那麼不會進行檔案排序,而是索引排序。
什麼時候發生索引排序呢?
查詢索引和order by的欄位是同一個欄位。比如:
select * from table where id > 0 order by id
注意:這句話話不總是成立的,因為查詢優化器會改寫我們的查詢sql,讓我們的sql按照最優的方式執行,那麼
select * from table where id > 0 order by id 的查詢按照我們的理解,應該會走索引,但是explain中顯示的是filesort,因為這個時候,如果進行索引排序,那麼每次順序掃描下一條索引,就要回表,很多的隨機I/O發生。
但是 select id from table where id > 0 order by id 是走索引排序的。
注意:Using where; Using temporary; Using filesort和Using where; Using temporary這兩種情況的解說如下:
Using where; Using temporary; Using filesort:表示進行關聯查詢時(mysql中關聯查詢的概念要更寬泛,不僅僅指兩張表的關聯才叫關聯查詢),使用了臨時表,並在生成臨時表後,又進行了檔案排序;
而Using where; Using temporary表示,僅僅生成了臨時表,而沒有進行檔案排序(在生成臨時表的時候已經排序完畢了)。

有人可能注意了:什麼時候會Using temporary,比如group by 的時候就會建立臨時表,而且group by 一定包含了排序,因此,當group by 欄位和查詢的欄位和order by的欄位都是同一個欄位時,那麼就會發生explain 的Extra列就會出現:Using where; Using temporary(使用了臨時表,而且使用了索引排序,而不是檔案排序(filesort))。