程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL order by機能優化辦法實例

MySQL order by機能優化辦法實例

編輯:MySQL綜合教程

MySQL order by機能優化辦法實例。本站提示廣大學習愛好者:(MySQL order by機能優化辦法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL order by機能優化辦法實例正文


媒介

任務進程中,各類營業需求在拜訪數據庫的時刻請求有order by排序。有時刻不用要的或許不公道的排序操作極可能招致數據庫體系瓦解。若何處置好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 選擇應用第二種單路算法來停止排序。如許可以削減年夜量的隨機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 參數設置

  這個值假如太小的話,再加上你一次前往的條數過量,那末極可能就會分許多次停止排序,然後最初將每次的排序成果再串連起來,如許就會更慢,增年夜 sort_buffer_size 其實不是為了讓 MySQL選擇改良版的排序算法,而是為了讓MySQL盡可能削減在排序進程中對需要排序的數據停止分段,由於分段會形成 MySQL 不能不應用暫時表來停止交流排序。

然則這個值不是越年夜越好:

1 Sort_Buffer_Size 是一個connection級參數,在每一個connection第一次須要應用這個buffer的時刻,一次性分派設置的內存。
2 Sort_Buffer_Size 其實不是越年夜越好,因為是connection級的參數,過年夜的設置+高並發能夠會耗盡體系內存資本。
3 聽說Sort_Buffer_Size 跨越2M的時刻,就會應用mmap() 而不是 malloc() 來停止內存分派,招致效力下降。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved