最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年05月29日 10:48:33   投稿:junjie  
這篇文章主要介紹了MySQL order by性能優(yōu)化方法實例,本文講解了MySQL中order by的原理和優(yōu)化order by的三種方法,需要的朋友可以參考下

前言

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

一 MySQL中order by的原理

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

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

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

  由于沒有可以利用的有序索引取得有序的數(shù)據(jù),MySQL需要通過相應(yīng)的排序算法,將取得的數(shù)據(jù)在sort_buffer_size系統(tǒng)變量所設(shè)置大小的排序區(qū)進(jìn)行排序,這個排序區(qū)是每個Thread 獨享的,所以說可能在同一時刻在 MySQL 中可能存在多個 sort buffer 內(nèi)存區(qū)域。
  在MySQL中filesort 的實現(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)也會耗用更多的 sort buffer 空間。典型的以空間換時間的優(yōu)化方式。當(dāng)然,MySQL4.1開始的以后所有版本同時也支持第一種算法,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)無法避免排序操作時,又該如何來優(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)所有返回字段的最大長度小于這個參數(shù)值時,MySQL 就會選擇改進(jìn)后的排序算法,反之,則選擇老式的算法。所以,如果有充足的內(nèi)存讓MySQL 存放須要返回的非排序字段,就可以加大這個參數(shù)的值來讓 MySQL 選擇使用改進(jìn)版的排序算法。

2 去掉不必要的返回字段

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

3 增大 sort_buffer_size 參數(shù)設(shè)置

  這個值如果過小的話,再加上你一次返回的條數(shù)過多,那么很可能就會分很多次進(jìn)行排序,然后最后將每次的排序結(jié)果再串聯(lián)起來,這樣就會更慢,增大 sort_buffer_size 并不是為了讓 MySQL選擇改進(jìn)版的排序算法,而是為了讓MySQL盡量減少在排序過程中對須要排序的數(shù)據(jù)進(jìn)行分段,因為分段會造成 MySQL 不得不使用臨時表來進(jìn)行交換排序。

但是這個值不是越大越好:

1 Sort_Buffer_Size 是一個connection級參數(shù),在每個connection第一次需要使用這個buffer的時候,一次性分配設(shè)置的內(nèi)存。
2 Sort_Buffer_Size 并不是越大越好,由于是connection級的參數(shù),過大的設(shè)置+高并發(fā)可能會耗盡系統(tǒng)內(nèi)存資源。
3 據(jù)說Sort_Buffer_Size 超過2M的時候,就會使用mmap() 而不是 malloc() 來進(jìn)行內(nèi)存分配,導(dǎo)致效率降低。

相關(guān)文章

  • 如何使用mysqladmin獲取一個mysql實例當(dāng)前的TPS和QPS

    如何使用mysqladmin獲取一個mysql實例當(dāng)前的TPS和QPS

    這篇文章主要介紹了如何使用mysqladmin這個工具來獲取一個mysql實例當(dāng)前的TPS和QPS,幫助大家更好的管理數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • MySQL的表約束的具體使用

    MySQL的表約束的具體使用

    本文主要介紹了MySQL的表約束,通過合理地使用 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY 和 CHECK 約束,可以有效防止錯誤數(shù)據(jù)進(jìn)入數(shù)據(jù)庫,感興趣的可以了解一下
    2024-07-07
  • MYSQL Left Join優(yōu)化(10秒優(yōu)化到20毫秒內(nèi))

    MYSQL Left Join優(yōu)化(10秒優(yōu)化到20毫秒內(nèi))

    在實際開發(fā)中,相信大多數(shù)人都會用到j(luò)oin進(jìn)行連表查詢,但是有些人發(fā)現(xiàn),用join好像效率很低,而且驅(qū)動表不同,執(zhí)行時間也不同。那么join到底是如何執(zhí)行的呢,本文就詳細(xì)的介紹一下
    2021-12-12
  • MySQL數(shù)據(jù)庫中varchar類型的數(shù)字比較大小的方法

    MySQL數(shù)據(jù)庫中varchar類型的數(shù)字比較大小的方法

    varchar類型的數(shù)據(jù)是不能直接比較大小的,那么MySQL數(shù)據(jù)庫中varchar類型如何進(jìn)行數(shù)字比較大小的,本文就詳細(xì)的介紹一下
    2021-11-11
  • MySQL的mysqldump工具用法詳解

    MySQL的mysqldump工具用法詳解

    這篇文章主要介紹了MySQL的mysqldump工具用法詳解,同時附帶了相關(guān)Source命令的用法,詳解需要的朋友可以參考下
    2015-07-07
  • MySQL?Prepared?Statement?預(yù)處理的操作方法

    MySQL?Prepared?Statement?預(yù)處理的操作方法

    預(yù)處理語句是一種在數(shù)據(jù)庫管理系統(tǒng)中使用的編程概念,用于執(zhí)行對數(shù)據(jù)庫進(jìn)行操作的?SQL?語句,這篇文章主要介紹了MySQL?Prepared?Statement?預(yù)處理?,需要的朋友可以參考下
    2024-08-08
  • 解析mysql中:單表distinct、多表group by查詢?nèi)コ貜?fù)記錄

    解析mysql中:單表distinct、多表group by查詢?nèi)コ貜?fù)記錄

    本篇文章是對mysql中的單表distinct、多表group by查詢?nèi)コ貜?fù)記錄進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解MySQL批量入庫的幾種方式

    詳解MySQL批量入庫的幾種方式

    本文主要介紹了詳解MySQL批量入庫的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Mysql配置主從復(fù)制-GTID模式詳解

    Mysql配置主從復(fù)制-GTID模式詳解

    這篇文章主要介紹了Mysql配置主從復(fù)制-GTID模式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Mysql WorkBench安裝配置圖文教程

    Mysql WorkBench安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Mysql WorkBench安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

玛多县| 庆云县| 龙南县| 旺苍县| 达孜县| 明光市| 施甸县| 霍州市| 台前县| 清流县| 奇台县| 秭归县| 黔南| 桂东县| 日喀则市| 兰州市| 常宁市| 阜康市| 布拖县| 两当县| 康马县| 永川市| 石屏县| 雅安市| 孟州市| 肥乡县| 奎屯市| 平塘县| 罗定市| 宾阳县| 吕梁市| 北碚区| 乌拉特前旗| 普陀区| 陇南市| 顺昌县| 乌拉特后旗| 泸水县| 龙胜| 科尔| 始兴县|