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

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL order by性能優(yōu)化方法實(shí)例

2024-07-24 12:45:58
字體:
供稿:網(wǎng)友

前言

工作過程中,各種業(yè)務(wù)需求在訪問數(shù)據(jù)庫的時(shí)候要求有order by排序。有時(shí)候不必要的或者不合理的排序操作很可能導(dǎo)致數(shù)據(jù)庫系統(tǒng)崩潰。如何處理好order by排序呢?本文從原理以及優(yōu)化層面介紹 order by 。

一 MySQL中order by的原理

  1 利用索引的有序性獲取有序數(shù)據(jù)

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

  2 利用內(nèi)存/磁盤文件排序獲取結(jié)果

  由于沒有可以利用的有序索引取得有序的數(shù)據(jù),MySQL需要通過相應(yīng)的排序算法,將取得的數(shù)據(jù)在sort_buffer_size系統(tǒng)變量所設(shè)置大小的排序區(qū)進(jìn)行排序,這個(gè)排序區(qū)是每個(gè)Thread 獨(dú)享的,所以說可能在同一時(shí)刻在 MySQL 中可能存在多個(gè) sort buffer 內(nèi)存區(qū)域。
  在MySQL中filesort 的實(shí)現(xiàn)算法有兩種:

  1) 雙路排序:是首先根據(jù)相應(yīng)的條件取出相應(yīng)的排序字段和可以直接定位行數(shù)據(jù)的行指針信息,然后在sort buffer 中進(jìn)行排序。
  2) 單路排序:是一次性取出滿足條件行的所有字段,然后在sort buffer中進(jìn)行排序。

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

二 優(yōu)化order by

當(dāng)無法避免排序操作時(shí),又該如何來優(yōu)化呢?很顯然,優(yōu)先選擇第一種using index 的排序方式,在第一種方式無法滿足的情況下,盡可能讓 MySQL 選擇使用第二種單路算法來進(jìn)行排序。這樣可以減少大量的隨機(jī)IO操作,很大幅度地提高排序工作的效率。

1 加大 max_length_for_sort_data 參數(shù)的設(shè)置

  在 MySQL 中,決定使用老式排序算法還是改進(jìn)版排序算法是通過參數(shù) max_length_for_ sort_data 來決定的。當(dāng)所有返回字段的最大長(zhǎng)度小于這個(gè)參數(shù)值時(shí),MySQL 就會(huì)選擇改進(jìn)后的排序算法,反之,則選擇老式的算法。所以,如果有充足的內(nèi)存讓MySQL 存放須要返回的非排序字段,就可以加大這個(gè)參數(shù)的值來讓 MySQL 選擇使用改進(jìn)版的排序算法。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乾安县| 丹江口市| 斗六市| 二连浩特市| 桐乡市| 陆良县| 茌平县| 新和县| 九江市| 射洪县| 平谷区| 满洲里市| 朝阳县| 夏河县| 阆中市| 海原县| 仁化县| 漳州市| 和龙市| 密云县| 隆化县| 郴州市| 贡觉县| 申扎县| 油尖旺区| 上虞市| 丰原市| 年辖:市辖区| 巴林左旗| 云霄县| 黎平县| 长葛市| 江都市| 玛纳斯县| 吉隆县| 井陉县| 旬阳县| 彰武县| 利辛县| 贵定县| 鸡西市|