国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL order by性能-優化方法實例

2019-11-02 15:36:51
字體:
來源:轉載
供稿:網友

   這篇文章主要介紹了MySQL order by性能優化方法實例,本文講解了MySQL中order by的原理和優化order by的三種方法,需要的朋友可以參考下

  前言

  工作過程中,各種業務需求在訪問數據庫的時候要求有order by排序。有時候不必要的或者不合理的排序操作很可能導致php?/%CA%FD%BE%DD%BF%E2%CF%B5%CD%B3' target='_blank'>數據庫系統崩潰。如何處理好order by排序呢?本文從原理以及優化層面介紹 order by 。

  一 MySQL中order by的原理

  1 利用索引的有序性獲取有序數據

  當查詢語句的 order BY 條件和查詢的執行計劃中所利用的 Index 的索引鍵(或前面幾個索引鍵)完全一致,且索引訪問方式為 rang,ref 或者 index 的時候,MySQL 可以利用索引順序而直接取得已經排好序的數據。這種方式的 order BY 基本上可以說是最優的排序方式了,因為 MySQL 不需要進行實際的排序操作。需要注意的是使用索引排序也有很多限制。這個在后文中中解釋。

  2 利用內存/磁盤文件排序獲取結果

  由于沒有可以利用的有序索引取得有序的數據,MySQL需要通過相應的排序算法,將取得的數據在sort_buffer_size系統變量所設置大小的排序區進行排序,這個排序區是每個Thread 獨享的,所以說可能在同一時刻在 MySQL 中可能存在多個 sort buffer 內存區域。

  在MySQL中filesort 的實現算法有兩種:

  1) 雙路排序:是首先根據相應的條件取出相應的排序字段和可以直接定位行數據的行指針信息,然后在sort buffer 中進行排序。

  2) 單路排序:是一次性取出滿足條件行的所有字段,然后在sort buffer中進行排序。

  在 MySQL4.1 版本之前只有第一種排序算法,第二種算法是從MySQL4.1開始的改進算法,主要目的是為了減少第一次算法中需要兩次訪問表數據的IO操作,將兩次變成了一次,但相應也會耗用更多的 sort buffer 空間。典型的以空間換時間的優化方式。當然,MySQL4.1開始的以后所有版本同時也支持第一種算法,MySQL主要通過比較系統參數 max_length_for_sort_data的大小和Query語句所取出的字段類型大小總和來判定需要使用哪一種排序算法。如果max_length_for_sort_data更大,則使用第二種優化后的算法,反之使用第一種算法。所以如果希望 order BY 操作的效率盡可能的高,需要注意max_length_for_sort_data參數的設置。

  二 優化order by

  當無法避免排序操作時,又該如何來優化呢?很顯然,優先選擇第一種using index 的排序方式,在第一種方式無法滿足的情況下,盡可能讓 MySQL 選擇使用第二種單路

搞笑內涵圖[www.62-6.com/1/nahantu/]
算法來進行排序。這樣可以減少大量的隨機IO操作,很大幅度地提高排序工作的效率。

  1 加大 max_length_for_sort_data 參數的設置

  在 MySQL 中,決定使用老式排序算法還是改進版排序算法是通過參數 max_length_for_ sort_data 來決定的。當所有返回字段的最大長度小于這個參數值時,MySQL 就會選擇改進后的排序算法,反之,則選擇老式的算法。所以,如果有充足的內存讓MySQL 存放須要返回的非排序字段,就可以加大這個參數的值來讓 MySQL 選擇使用改進版的排序算法。

  2 去掉不必要的返回字段

  當內存不是很充裕時,不能簡單地通過強行加大上面的參數來強迫 MySQL 去使用改進版的排序算法,否則可能會造成 MySQL 不得不將數據分成很多段,然后進行排序,這樣可能會得不償失。此時就須要去掉不必要的返回字段,讓返回結果長度適應 max_length_for_sort_data 參數的限制。

  3 增大 sort_buffer_size 參數設置

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淄博市| 余姚市| 台南市| 互助| 鹰潭市| 岐山县| 鹤壁市| 星子县| 都兰县| 通州市| 修武县| 五指山市| 新宾| 屏东市| 苏尼特右旗| 双峰县| 宁夏| 太仆寺旗| 靖安县| 杂多县| 岳阳县| 乡宁县| 弥渡县| 阳泉市| 铅山县| 荆州市| 拉孜县| 白山市| 龙南县| 宁德市| 汾阳市| 南溪县| 黄梅县| 永仁县| 新民市| 武宣县| 新竹市| 育儿| 金塔县| 湾仔区| 无极县|