mysql join是哪種(mysql的join)

    本文主要介紹什么是mysql join (mysql join)?,下面一起看看什么是mysql join (mysql join)?相關(guān)資訊。
    join語句原理join模式連接多個表,其本質(zhì)是表間數(shù)據(jù)的循環(huán)匹配。在mysql 5.5版之前,mysql只支持一種表間關(guān)聯(lián),即嵌套循環(huán)連接。如果相關(guān)聯(lián)的表具有大量數(shù)據(jù),
    加入關(guān)聯(lián)的執(zhí)行時間會很長。在mysql5.5以后的版本中,mysql通過引入bnlj算法優(yōu)化嵌套執(zhí)行。
    驅(qū)動工作臺和從動工作臺是主工作臺,從動工作臺是從動工作臺和非從動工作臺。
    select * from a join b on...a必須是驅(qū)動表嗎?不一定,優(yōu)化器會根據(jù)你的查詢語句進行優(yōu)化,決定先查哪個表。首先查詢的表是驅(qū)動表,反之亦然。可以通過explain關(guān)鍵字查看。
    左邊的外部連接加上where是過濾條件,查詢優(yōu)化器幫助我優(yōu)化了它。b是驅(qū)動表,a是被驅(qū)動表的左外連接加and,and都是on條件,這也是和上面where的區(qū)別。(查詢優(yōu)化器沒有 t在這里幫我們調(diào)整)采用簡單的嵌套循環(huán)連接算法相當(dāng)簡單,有三種循環(huán)匹配。從表a中取出一條數(shù)據(jù)1,遍歷表b,將匹配的數(shù)據(jù)放入結(jié)果…中,以此類推,判斷驅(qū)動表a中的每條記錄和被驅(qū)動表b中的記錄:
    可見這種方法效率很低。如果表a中有a*b= 10個數(shù)據(jù),表b中有1000個數(shù)據(jù),那么a* b = 100000次。支出統(tǒng)計如下:
    索引嵌套循環(huán)連接(index nested-loop join)索引嵌套循環(huán)連接的優(yōu)化思想主要是減少內(nèi)部表數(shù)據(jù)的匹配次數(shù),因此要求被驅(qū)動表上必須有索引。外表的匹配條件直接與內(nèi)表的索引匹配,避免了與內(nèi)表各層的記錄進行比較,大大減少了內(nèi)表的匹配次數(shù)。
    驅(qū)動表中的每條記錄都是通過被驅(qū)動表的索引來訪問的。由于索引查詢的成本相對固定,mysql優(yōu)化器傾向于使用記錄較少的表作為驅(qū)動表(外觀)。
    如果從動表被索引,效率是非常高的。但是,如果索引不是主鍵索引,則需要對表進行查詢。相比之下,驅(qū)動表的索引是主鍵索引,效率更高。
    塊嵌套循環(huán)連接如果有索引,它將被索引連接。如果連接的列中沒有索引,從動表將被掃描太多次。每個訪問都是驅(qū)動的。表,表中的記錄會加載到內(nèi)存中,然后從驅(qū)動表中取一條與之匹配,匹配后清空內(nèi)存,然后從驅(qū)動表中加載一條記錄,再將驅(qū)動表的記錄加載到內(nèi)存中進行匹配,這樣會大大增加io的數(shù)量。為了減少被驅(qū)動表的io次數(shù),出現(xiàn)了塊嵌套循環(huán)連接的。
    我們不是一個一個的獲取驅(qū)動表的數(shù)據(jù),而是一個一個的獲取。我們引入join buffer buffer,在join buffer中緩存一些與驅(qū)動表join相關(guān)的數(shù)據(jù)列(大小受join buffer限制),然后在整個表中掃描被驅(qū)動表,被驅(qū)動表的每條記錄一次性匹配join buffer中的所有驅(qū)動表記錄(內(nèi)存中的操作),從而將簡單嵌套循環(huán)中的多次比較合并為一次,減少了被驅(qū)動。
    注意:
    這里不僅緩存了關(guān)聯(lián)表的列,還緩存了select之后的列。(所有投影應(yīng)該盡可能少*)在具有n個連接關(guān)聯(lián)的sql中,將分配n-1個連接緩沖區(qū)。所以在查詢時盡量減少不必要的字段,這樣就可以在連接緩沖區(qū)中存儲更多的列。
    參數(shù)設(shè)置:block_nested_loop通過show變量如 % optimizer _開關(guān) 。默認(rèn)情況下,它是打開的。
    顯示變量,如 % optimizer _開關(guān) ;
    join_buffer驅(qū)動程序表不能一次加載,這取決于聯(lián)接緩沖區(qū)是否能存儲所有數(shù)據(jù)。默認(rèn)情況下,join_buffer_size=256k。
    顯示變量,如 % join _ buffer % ;mysql顯示變量如 % join _ buffer % ;---| variable _ name | value |-| join_buffer_size | 262144 |-set(0.00 sec)中1行的最大值join _ buffer _ size在32位系統(tǒng)中可以應(yīng)用于4g,但在64位操作系統(tǒng)中可以應(yīng)用于大于4g的連接緩沖區(qū)空間(64位windows除外,最大值為)。。
    join總體效果對比總結(jié):inlj bnlj snlj總是用小結(jié)果集驅(qū)動大結(jié)果集(其本質(zhì)是減少外循環(huán)的數(shù)據(jù)量)(小的度量單位是指表中的行數(shù)*每行的大小)(即取決于過濾后的結(jié)果集)。情況:假設(shè)t2表中的字段數(shù)大于1,如果使用第二個,t2。*將超過t1.b中的字段,在join_buffer中。
    選擇t1.b,t2。*從t1直線連接t2 on (t1.b=t2.b ),其中t2.id = 108#建議選擇t1.b,t2。*從t2 straight _ join t1on (t1.b = t2.b)其中t2.id = 100#不推薦
    對驅(qū)動表匹配的條件增加索引(減少內(nèi)層循環(huán)匹配的次數(shù))增加連接緩沖區(qū)的大小(一次緩存的數(shù)據(jù)越多,內(nèi)層包的掃描次數(shù)越少)減少驅(qū)動表不必要的字段查詢(字段越少,連接緩沖區(qū)緩存的數(shù)據(jù)越多)。hash join會從mysql 8 . 0 . 20版拋棄bnlj,因為從mysql8.0.18版會拋棄bnlj。
    當(dāng)連接的數(shù)據(jù)子集很小時,嵌套循環(huán)嵌套循環(huán)是更好的選擇。散列連接是連接大型數(shù)據(jù)集的一種常見。優(yōu)化器使用兩個表中較小的(相對較小的)表,通過使用連接鍵在內(nèi)存中構(gòu)建哈希表,然后掃描較大的表并檢測哈希表,找出與哈希表匹配的行。這種方法適用于較小的表可以完全放入內(nèi)存的情況,所以總開銷是訪問兩個表的開銷之和。當(dāng)桌子很大時,它可以 不要完全記在記憶里。這時,優(yōu)化器將把它分成幾個不同的分區(qū),可以 將被寫入磁盤的臨時段。此時,需要一個大的臨時段來盡可能提高i/o的性能。它可以在沒有索引和并行查詢的大表環(huán)境中很好地工作,提供最佳的性能。大多數(shù)人說這是一個沉重的負(fù)擔(dān)。hash join只能應(yīng)用于equijoin(比如其中a.col1=b.col2),這是由hash的特性決定的。summary確保驅(qū)動表的連接字段已經(jīng)創(chuàng)建了索引中需要連接的字段,并且數(shù)據(jù)類型絕對一致。左連接時,選擇小表作為驅(qū)動表,選擇大表作為從動表。減少外部循環(huán)的數(shù)量。內(nèi)連接時,mysql會自動選擇小結(jié)果集的表作為drive。移動手表。選擇信任mysql優(yōu)化策略。可以盡可能多的直接關(guān)聯(lián)多個表,沒有子查詢。(減少查詢次數(shù))不建議使用子查詢。建議將子查詢sql反匯編后與程序合并進行多次查詢,或者用join代替子查詢。派生表無法構(gòu)建選項卡:
    索引數(shù)據(jù)
    了解更多什么是mysql join (mysql join)?相關(guān)內(nèi)容請關(guān)注本站點。

    查詢ip,如何查電腦IP地址
    臺式機硬盤和監(jiān)控硬盤有什么區(qū)別,監(jiān)控硬盤和臺式機硬盤有什么分別
    平果7怎么截圖,iPhone7如何截屏蘋果7 Plus怎么截圖
    電腦的桌面圖標(biāo)怎么縮小(電腦的桌面圖標(biāo)怎么放到左邊)
    小米3不用數(shù)據(jù)線怎么連接電腦,如何讓小米3不用USB調(diào)試連接電腦
    mysql join是哪種(mysql的join)
    小米手機怎么設(shè)置禁止瀏覽不良的網(wǎng)站(小米怎么禁止訪問網(wǎng)站)
    小米3怎么強制關(guān)機,小米怎么強制關(guān)機后充點不顯示不顯示充點進度
    鼠標(biāo)反應(yīng)慢怎么辦(鼠標(biāo)反應(yīng)慢怎么辦解決)
    在線攢機助手,手機那款A(yù)PP可以自助攢機
    小米8康寧大猩猩幾代屏幕(小米8是康寧大猩猩第幾代)
    win10專業(yè)版沒有office怎么辦(windows10專業(yè)版沒有office)
    win7每次開機都要配置windows(win7系統(tǒng)每次開機需要點賬號)
    別人抖音視頻已消失怎么回事兒(別人的抖音視頻已消失)
    手機如何把聲音變大(手機怎么能把聲音變大)
    努比亞z17s好用嗎(努比亞z17zol)
    三星s7怎么安裝內(nèi)存卡,三星s7怎么把軟件安裝到sd卡
    為什么火螢壁紙總是消失(火螢壁紙為什么下載不了)
    移動硬盤分哪幾種類型,移動硬盤分哪些類別
    組裝機酷睿i77700k電腦配置清單及價格表(組裝機酷睿i77700k電腦配置清單及價格及圖片)
    主站蜘蛛池模板: 亚洲AV无码一区二区三区久久精品| 中文字幕亚洲乱码熟女一区二区 | 日本伊人精品一区二区三区| 韩国精品一区视频在线播放| 亚洲福利电影一区二区?| 琪琪see色原网一区二区| 亚洲AV无码一区二区三区网址| 国内偷窥一区二区三区视频| 日韩精品无码Av一区二区 | 精品成人一区二区三区四区| 无码夜色一区二区三区| 在线播放一区二区| 亚洲国产日韩一区高清在线| 亚洲AV无码一区二区二三区软件| 亚洲国产一区二区视频网站| 国产aⅴ一区二区| 正在播放国产一区| 国内精品一区二区三区最新 | 国产午夜福利精品一区二区三区 | 夜色阁亚洲一区二区三区 | 一区二区三区日韩精品| 国产成人无码精品一区二区三区| 国产一区二区三区免费观在线| 亚洲成av人片一区二区三区 | 中文字幕一区二区三区在线播放| 精品一区二区三区四区电影 | 亚洲bt加勒比一区二区| 亚洲AV无码一区二区二三区软件| 国产另类TS人妖一区二区| 亚洲一区精品无码| 久久久久成人精品一区二区| 久久久精品人妻一区亚美研究所| 亚洲AV本道一区二区三区四区| 一区二区三区国产精品| 亚洲一区二区三区在线网站| 亚洲精品国产suv一区88| 国产香蕉一区二区三区在线视频 | 亚洲无码一区二区三区| 韩国女主播一区二区| 亚洲一区二区视频在线观看| 亚洲综合无码精品一区二区三区 |