MySQL之order by

541732025發表於2013-05-26
在mysql裡面,order by有兩種實現方式,一種是利用有序索引獲取有序資料,另一種則是透過相應的排序演算法,將取得的資料在記憶體中進行排序。
1,利用有序索引進行排序,實際上就是當我們 Query 的 ORDER BY 條件和 Query 的執行計劃中所利用的 Index 的索引鍵(或前面幾個索引鍵)完全一致,且索引訪問方式為 rang、 ref 或者 index 的時候,MySQL 可以利用索引順序而直接取得已經排好序的資料。這種方式的 ORDER BY 基本上可以說是最優的排序方式了,因為 MySQL 不需要進行實際的排序操作

2、透過相應的排序演算法,將取得的資料在記憶體中進行排序方式,MySQL 需要將資料在記憶體中進行排序,所使用的記憶體區域也就是我們透過 sort_buffer_size 系統變數所設定的排序區。這個排序區是每個 Thread 獨享的,所以說可能在同一時刻在 MySQL 中可能存在多個 sort buffer 記憶體區域,如果併發數很高,很可能存在效能瓶頸。
這種方式在執行計劃中被稱為filesort。在 MySQL 中 filesort 的實現演算法實際上是有兩種一種是首先根據相應的條件取出相應的排序欄位和可以直接定位行資料的行指標資訊,然後在 sort buffer 中進行排序。另外一種是一次性取出滿足條件行的所有欄位,然後在 sort buffer 中進行排序。
在 MySQL4.1 之前只有第一種排序演算法,第二種演算法是從 MySQL4.1才開始支援,主要目的是為了減少第一種演算法中需要兩次訪問表資料的 IO 操作,將兩次變成了一次,但相應也會耗用更多的 sort buffer 空間。MySQL 主要透過比較設定的系統引數 max_length_for_sort_data 的大小和 Query 語句所取出的欄位型別大小總和來判定需要使用哪一種排序演算法。如果 max_length_for_sort_data 更大,則使用第二種最佳化後的演算法,反之使用第一種演算法。所以如果希望 ORDER BY 操作的效率儘可能的高,儘可能將max_length_for_sort_data 、sort buffer調高。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28912557/viewspace-762044/,如需轉載,請註明出處,否則將追究法律責任。

相關文章