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

MySQL?臨時表的原理以及優(yōu)化方法

 更新時間:2022年08月22日 10:26:40   作者:劉Java  
這篇文章主要介紹了MySQL?臨時表的原理以及優(yōu)化方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

1 臨時表

sort buffer、內(nèi)存臨時表和join buffer,這三個數(shù)據(jù)結構都是用來存放語句執(zhí)行過程中的中間數(shù)據(jù),以輔助SQL語句的執(zhí)行的。其中,在排序的時候用到了sort buffer,在使用join語句的時候用到了join buffer。

而使用臨時表的時候,ExplainExtra字段中具有Using temporary標記。union、group by、distinct等等查詢都有可能使用到臨時表。

2 union臨時表優(yōu)化

使用union的時候,就需要用到內(nèi)存臨時表來進行去重。

union語句的執(zhí)行流程為:

  • 創(chuàng)建一個內(nèi)存臨時表。
  • 執(zhí)行第一個子查詢,得到值,并存入臨時表中。
  • 執(zhí)行第二個子查詢:依次拿每一行數(shù)據(jù)和臨時表中的每一行數(shù)據(jù)比較,如果重復則不會插入,這樣就實現(xiàn)了去重的功能
  • 從臨時表中按行取出數(shù)據(jù),返回結果,并刪除臨時表。在最后這一步還可以對臨時表進行其他操作,比如limit、ORDER BY。

如果使用union all,則不需要去重,也就不需要臨時表了。在執(zhí)行的時候,就依次執(zhí)行子查詢,得到的結果直接作為結果集的一部分,發(fā)給客戶端。因此,除非確實需要服務器消除重復的行,否則就一定要使用UNION ALL,這一點很重要。如果沒有ALL關鍵字,MySQL會給臨時表加上DISTINCT選項,這會導致對整個臨時我的數(shù)據(jù)做唯一性檢查。這樣做的代價非常高。如果不需要這些檢查,那么甚至都不需要臨時表。

另外,避免對于union之后的結果集進行操作,也能避免臨時表的使用,通常需要手工地將MHERE、LIMIT、ORDER BY等子句“下推”到UNION的各個子查詢中,以便優(yōu)化器可以充分利用這些條件進行優(yōu)化,使得union的結果就是最終的結果(例如,直接將這些子句冗余地寫一份到各個子查詢)。

3 group by臨時表優(yōu)化

另外一個使用臨時表的例子是group by,group by還具有隱藏的排序的語句,即在對某些字段進行分組之后,將數(shù)據(jù)再根據(jù)這些字段進行排序,最后返回排序后的結果。

如下sql:

  select id%10 as m, count(*) as c from t1 group by m;  

這個語句的執(zhí)行流程是這樣的:

  • 創(chuàng)建內(nèi)存臨時表,表里有兩個字段m和c,主鍵是m;
  • 掃描表t1的索引a,依次取出葉子節(jié)點上的id值,計算id%10的結果,記為x;
    • 如果臨時表中沒有主鍵為x的行,就插入一個記錄(x,1);
    • 如果表中有主鍵為x的行,就將x這一行的c值加1;
    • 遍歷完成后,再根據(jù)字段m做排序,得到結果集返回給客戶端。

此時,Explain的Extra字段中具有Using temporary; Using filesort標記。

如果并不需要對結果進行排序,那可以在SQL語句末尾增加order by null,即:

  select id%10 as m, count(*) as c from t1 group by m order by null;  

這樣就跳過了最后排序的階段,直接從臨時表中取數(shù)據(jù)返回。

內(nèi)存臨時表的大小是有限制的,參數(shù)tmp_table_size就是控制這個內(nèi)存大小的,默認是16M。如果要處理的數(shù)據(jù)超過了最大大小,那么MySQL會把內(nèi)存臨時表轉成磁盤臨時表,而磁盤臨時表默認使用的引擎是InnoDB,因此會按主鍵順序存儲數(shù)據(jù),所以最終取出的結果還是默認有序的。

對于Group By的臨時表的優(yōu)化,同樣是使用索引:因為如果進行Group By字段是有序的,那么在處理時(比如計算每組數(shù)量、個數(shù)等等),因為跟著的字段有索引,那么相同的值肯定是在一起的、連續(xù)的,所以直接順序掃描輸入的數(shù)據(jù)即可,不需要臨時表,也不需要再額外排序。

總結:

  • 如果語句執(zhí)行過程可以一邊讀數(shù)據(jù),一邊直接得到結果,是不需要額外內(nèi)存的,否則就需要額外的內(nèi)存,來保存中間結果;
  • join_buffer是無序數(shù)組,sort_buffer是有序數(shù)組,臨時表是二維表結構;

如果執(zhí)行邏輯需要用到二維表特性,就會優(yōu)先考慮使用臨時表。比如我們的例子中,union需要用到唯一索引約束, group by還需要用到另外一個字段來存累積計數(shù)。

另外,對于distinct查詢來說,如果無法使用索引,則也會使用到臨時表,也會進行分組,它和group by的區(qū)別是不需要排序。

到此這篇關于MySQL 臨時表的原理以及優(yōu)化方法的文章就介紹到這了,更多相關MySQL 臨時表 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql 5.7.20壓縮版下載和安裝簡易教程

    Mysql 5.7.20壓縮版下載和安裝簡易教程

    這篇文章主要介紹了Mysql 5.7.20壓縮版下載和安裝簡易教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • MYSQL之on和where的區(qū)別解讀

    MYSQL之on和where的區(qū)別解讀

    這篇文章主要介紹了MYSQL之on和where的區(qū)別解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • mysql插入中文數(shù)據(jù)變成問號的解決方案

    mysql插入中文數(shù)據(jù)變成問號的解決方案

    這篇文章主要介紹了mysql插入中文數(shù)據(jù)變成問號的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 教你巧用mysql位運算解決多選值存儲的問題

    教你巧用mysql位運算解決多選值存儲的問題

    如果你不知道什么是位運算的話,那么請你先去看看基礎的C語言教程吧,下面這篇文章主要給大家介紹了關于如何巧用mysql位運算解決多選值存儲問題的相關資料,需要的朋友可以參考下
    2022-02-02
  • mysql 8.0.16 壓縮包安裝配置方法圖文教程

    mysql 8.0.16 壓縮包安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.16 壓縮包安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 如何解決mysql表輸入中文出現(xiàn)問號的問題

    如何解決mysql表輸入中文出現(xiàn)問號的問題

    這篇文章主要介紹了如何解決mysql表輸入中文出現(xiàn)問號的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)詳解

    mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)詳解

    這篇文章主要給大家介紹了關于mysql中find_in_set()函數(shù)用法及自定義增強函數(shù)的相關資料,在MySQL 數(shù)據(jù)庫中進行復雜的查詢語句,例如對多個字段進行篩選和排序,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的方法

    Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的方法

    這篇文章主要給大家介紹了關于在Ubuntu中更改MySQL數(shù)據(jù)庫文件目錄的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • Mysql聚合函數(shù)的使用介紹

    Mysql聚合函數(shù)的使用介紹

    今天的章節(jié)我們將要來學習一下 “聚合函數(shù)” ;首先我們需要學習聚合函數(shù)對數(shù)據(jù)進行統(tǒng)計分析,比如說求最大值、最小值、平均值之類的場景。但是單純的使用聚合函數(shù),只能做全表范圍的統(tǒng)計分析
    2022-10-10
  • MySQL中的聯(lián)合索引學習教程

    MySQL中的聯(lián)合索引學習教程

    這篇文章主要介紹了MySQL中的聯(lián)合索引學習教程,其中談到了聯(lián)合索引對排序的優(yōu)化等知識點,需要的朋友可以參考下
    2015-11-11

最新評論

贡嘎县| 西贡区| 长丰县| 牙克石市| 邛崃市| 禹城市| 军事| 通海县| 周至县| 乐清市| 平昌县| 庄河市| 洮南市| 芜湖市| 桃江县| 黄石市| 宁德市| 厦门市| 博湖县| 桐梓县| 苍山县| 卓尼县| 郴州市| 屯留县| 沁水县| 兴义市| 会昌县| 湘西| 余江县| 呼玛县| 孝义市| 卫辉市| 温泉县| 塔河县| 原阳县| 措勤县| 承德市| 锡林浩特市| 樟树市| 金门县| 永修县|