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

MySQL中Nested-Loop Join算法小結(jié)

 更新時間:2015年12月10日 11:37:33   投稿:hebedich  
數(shù)據(jù)庫中JOIN操作的實現(xiàn)主要有三種:嵌套循環(huán)連接(Nested Loop Join),歸并連接(Merge Join)和散列連接或者哈稀連接(Hash Join)。其中嵌套循環(huán)連接又視情況又有兩種變形:塊嵌套循環(huán)連接和索引嵌套循環(huán)連接。

 不知不覺的玩了兩年多的MySQL,發(fā)現(xiàn)很多人都說MySQL對比Oracle來說,優(yōu)化器做的比較差,其實某種程度上來說確實是這樣,但是畢竟MySQL才到5.7版本,Oracle都已經(jīng)發(fā)展到12c了,今天我就看了看MySQL的連接算法,嗯,現(xiàn)在來說還是不支持Hash Join,只有Nested-Loop Join,那今天就總結(jié)一下我學習的心得吧。

     Nested-Loop Join基本算法實現(xiàn),偽代碼是這樣:

for each row in t1 matching range {
 for each row in t2 matching reference key {
  for each row in t3 {
   if row satisfies join conditions,
   send to client
  }
 }
}

     這段代碼很簡單,雖然我也不怎么會寫代碼,但是我還是看得懂的。這里假設有三張表,t1, t2, t3,這段代碼,分別會展現(xiàn)出explain計劃里的range, ref和ALL,表現(xiàn)在SQL執(zhí)行計劃層里,t3就會進行一次全表掃描,我今天在這個地方看到了一個很妖的優(yōu)化SQL方法,Straight-join:http://hidba.ga/2014/09/26/join-query-in-mysql/,其中提到了驅(qū)動表的概念,那么對應過來,驅(qū)動表就是偽代碼里的t3表,博文里說MySQL會自動選擇結(jié)果集最小的表作為驅(qū)動表,作為算法分析,這樣選擇驅(qū)動表確實是消耗最小的辦法。那么這里還提到了,通過縮小驅(qū)動表結(jié)果集進行連接優(yōu)化,那么根據(jù)這個算法來看,結(jié)果集較小的驅(qū)動表確實可以使循環(huán)次數(shù)減少。

     當然了,MySQL自己在這個算法基礎上,演進出了Block Nested-Loop join算法,其實基本上和上面的算法沒有區(qū)別,偽代碼如下:

for each row in t1 matching range {
 for each row in t2 matching reference key {
  store used columns from t1, t2 in join buffer
  if buffer is full {
   for each row in t3 {
    for each t1, t2 combination in join buffer {
     if row satisfies join conditions,
     send to client
    }
   }
   empty buffer
  }
 }
}

if buffer is not empty {
 for each row in t3 {
  for each t1, t2 combination in join buffer {
   if row satisfies join conditions,
   send to client
  }
 }
}

     這個算法,將外層循環(huán)的數(shù)據(jù)緩存在join buffer中,內(nèi)層循環(huán)中的表回合buffer中的數(shù)據(jù)進行對比,從而減少循環(huán)次數(shù),這樣便可以提高效率。官網(wǎng)上有個example,我有點沒有看明白:如果有10行被緩存到了buffer里,這10行被傳給了內(nèi)層循環(huán),內(nèi)層循環(huán)的所有行都會和buffer中的這10行進行對比。原文是這樣的:  

For example, if 10 rows are read into a buffer and the buffer is passed to the next inner loop, each row read in the inner loop can be compared against all 10 rows in the buffer
      如果S指的是t1, t2組合在緩存中的大小,C是這些組合在buffer中的數(shù)量,那么t3表被掃描的次數(shù)應該是:

      (S * C)/join_buffer_size + 1

     根據(jù)這個算式,join_buffer_size越大,掃描的次數(shù)越小,如果join_buffer_size到了能緩存所有之前的行組合,那么這時就是性能最好的時候,之后再增大也就沒有什么效果了。

在有索引的情況下,MySQL會嘗試去使用Index Nested-Loop Join算法,在有些情況下,可能Join的列就是沒有索引,那么這時MySQL的選擇絕對不會是最先介紹的Simple Nested-Loop Join算法,因為那個算法太粗暴,不忍直視。數(shù)據(jù)量大些的復雜SQL估計幾年都可能跑不出結(jié)果,如果你不信,那就是too young too simple?;蛘逫nside君可以給你些SQL跑跑看。

Simple Nested-Loop Join算法的缺點在于其對于內(nèi)表的掃描次數(shù)太多,從而導致掃描的記錄太過龐大。Block Nested-Loop Join算法較Simple Nested-Loop Join的改進就在于可以減少內(nèi)表的掃描次數(shù),甚至可以和Hash Join算法一樣,僅需掃描內(nèi)表一次。

相關文章

  • MySQL用戶和數(shù)據(jù)權限管理詳解

    MySQL用戶和數(shù)據(jù)權限管理詳解

    這篇文章主要為大家詳細介紹了MySQL數(shù)據(jù)庫管理中的用戶和數(shù)據(jù)權限管理,文中的示例代碼講解詳細,對我們學習MySQL有一定幫助,需要的可以參考一下
    2022-08-08
  • 簡述MySql四種事務隔離級別

    簡述MySql四種事務隔離級別

    這篇文章主要介紹了MySql四種隔離級別,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下
    2020-08-08
  • Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程

    Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程

    這篇文章主要介紹了Mysql5.7.17 winx64.zip解壓縮版安裝配置圖文教程,需要的朋友可以參考下
    2018-03-03
  • MySQL多實例配置方案

    MySQL多實例配置方案

    MySQL多實例就是,在一臺機器上開啟多個不同的服務端口(如:3306,3307,3308...),運行多個MySQL服務進程,這些服務進程通過不同的socket監(jiān)聽不同的端口提供服務。
    2018-04-04
  • mysql如何比對兩個數(shù)據(jù)庫表結(jié)構的方法

    mysql如何比對兩個數(shù)據(jù)庫表結(jié)構的方法

    這篇文章主要介紹了mysql如何比對兩個數(shù)據(jù)庫表結(jié)構的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • MySQL如何匹配字符串函數(shù)

    MySQL如何匹配字符串函數(shù)

    MySQL提供多個字符串匹配函數(shù),如like、locate、position、instr和find_in_set,其中l(wèi)ocate、position、instr和find_in_set均返回字符在字段中的索引(如果包含),否則返回0,特別地,find_in_set適用于字段為數(shù)組的情況
    2024-11-11
  • MySQL中字符串函數(shù)詳細介紹

    MySQL中字符串函數(shù)詳細介紹

    通常以串的整體作為操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。
    2011-05-05
  • mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    mysql中l(wèi)imit查詢踩坑實戰(zhàn)記錄

    在MySQL中我們常常用order by來進行排序,使用limit來進行分頁,下面這篇文章主要給大家介紹了關于mysql中l(wèi)imit查詢踩坑的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • MySQL基礎入門之Case語句用法實例

    MySQL基礎入門之Case語句用法實例

    case語句是mysql中的一個條件語句,可以在字段中使用case語句進行復雜的篩選以及構造新的字段,下面這篇文章主要給大家介紹了關于MySQL基礎入門之Case語句用法的相關資料,需要的朋友可以參考下
    2022-08-08
  • LInux下安裝MySQL5.6 X64版本步驟詳解

    LInux下安裝MySQL5.6 X64版本步驟詳解

    這篇文章主要介紹了LInux下安裝MySQL5.6 X64版本步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04

最新評論

栾城县| 汤原县| 夹江县| 辉南县| 高雄县| 普洱| 五常市| 大田县| 宜都市| 新巴尔虎右旗| 东至县| 建瓯市| 佛教| 随州市| 大名县| 澎湖县| 柳州市| 定安县| 六盘水市| 昭觉县| 北票市| 兴宁市| 连州市| 石楼县| 建水县| 西乌| 海晏县| 安图县| 广西| 沙田区| 邛崃市| 天等县| 三台县| 东城区| 长治县| 桐梓县| 从化市| 普定县| 阳东县| 探索| 乐清市|