MySQL之order by
在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調高。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 之 ORDER BY FIELDMySql
- 【MySQL】效能優化之 order by (一)MySql優化
- mysql order by 優化MySql優化
- MySQL Order BY 排序過程MySql排序
- mysql的order by和group byMySql
- MySQL, Incorrect usage of UNION and ORDER BYMySql
- MySql ORDER BY索引是否失效MySql索引
- MySQL 5.7:desc order by反向定位MySql
- MySQL——優化ORDER BY語句MySql優化
- 【MySQL】order by 原理以及優化MySql優化
- 【MySQL】再說order by 優化MySql優化
- MySQL order by 排序結果不正確MySql排序
- mysql order by是怎麼工作的?MySql
- MySQL 5.7 ORDER BY排序的優化MySql排序優化
- 【MySQL】order by 原理以及最佳化MySql
- MySQL LIMIT 和 ORDER BY 最佳化MySqlMIT
- mysql order by 和 group by 順序問題MySql
- Oracle分頁查詢之order byOracle
- MySQL distinct 和 order by 排序混淆的替代方案MySql排序
- MySQL利用索引優化ORDER BY排序語句MySql索引優化排序
- MySql Order By 多個欄位 排序規則MySql排序
- MYSQL order by排序與索引關係總結MySql排序索引
- mysql按照漢字拼音進行order by排序MySql排序
- MYSQL order by排序導致效率低小優化MySql排序優化
- MySql5.7及以上 ORDER BY 報錯問題MySql
- MySQL按指定順序排序(order by field的使用)MySql排序
- MySQL中ORDER BY與LIMIT一起使用(有坑)MySqlMIT
- MySQL 中 一條 order by index limit 語句的分析MySqlIndexMIT
- MySQL Order by 語句用法與最佳化詳解MySql
- MySQL(select_paren)union_order_or_limit行為MySqlMIT
- MySQL order by limit 分頁資料重複問題MySqlMIT
- eslint-plugin-import 規則之 Import / OrderEsLintPluginImport
- MySQL中union和order by同時使用的實現方法MySql
- CSS orderCSS
- LeetCode之Reveal Cards In Increasing Order(Kotlin)LeetCodeKotlin
- LeetCode之Increasing Order Search Tree(Kotlin)LeetCodeKotlin
- 【SQL 學習】排序問題之order by與索引排序SQL排序索引
- 【MySQL】order by 結果不準確的問題及解決MySql