本文主要介紹什么是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電腦配置清單及價格及圖片)