mysql join是哪種(mysql的join)

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

    查詢ip,如何查電腦IP地址
    臺式機硬盤和監控硬盤有什么區別,監控硬盤和臺式機硬盤有什么分別
    平果7怎么截圖,iPhone7如何截屏蘋果7 Plus怎么截圖
    電腦的桌面圖標怎么縮小(電腦的桌面圖標怎么放到左邊)
    小米3不用數據線怎么連接電腦,如何讓小米3不用USB調試連接電腦
    mysql join是哪種(mysql的join)
    小米手機怎么設置禁止瀏覽不良的網站(小米怎么禁止訪問網站)
    小米3怎么強制關機,小米怎么強制關機后充點不顯示不顯示充點進度
    鼠標反應慢怎么辦(鼠標反應慢怎么辦解決)
    在線攢機助手,手機那款APP可以自助攢機
    小米8康寧大猩猩幾代屏幕(小米8是康寧大猩猩第幾代)
    win10專業版沒有office怎么辦(windows10專業版沒有office)
    win7每次開機都要配置windows(win7系統每次開機需要點賬號)
    別人抖音視頻已消失怎么回事兒(別人的抖音視頻已消失)
    手機如何把聲音變大(手機怎么能把聲音變大)
    努比亞z17s好用嗎(努比亞z17zol)
    三星s7怎么安裝內存卡,三星s7怎么把軟件安裝到sd卡
    為什么火螢壁紙總是消失(火螢壁紙為什么下載不了)
    移動硬盤分哪幾種類型,移動硬盤分哪些類別
    組裝機酷睿i77700k電腦配置清單及價格表(組裝機酷睿i77700k電腦配置清單及價格及圖片)
    主站蜘蛛池模板: 久久亚洲日韩精品一区二区三区 | 在线免费观看一区二区三区| 午夜福利无码一区二区| 国产精品一区在线观看你懂的| 成人中文字幕一区二区三区| 久久久久久人妻一区精品| 国模丽丽啪啪一区二区| 视频在线观看一区二区| 在线视频一区二区三区四区| 一区二区传媒有限公司| 日韩精品区一区二区三VR| 亚洲AV无码一区二区三区DV| 国产探花在线精品一区二区| 国产综合一区二区在线观看| 中文字幕一区二区三区免费视频| 国产伦精品一区二区三区在线观看 | 日本精品一区二区三区在线观看| 国产精品一区二区av不卡| 秋霞电影网一区二区三区| 无码人妻精品一区二区三区9厂| 国产大秀视频在线一区二区 | 精品中文字幕一区二区三区四区| 国内精品一区二区三区在线观看| 国产微拍精品一区二区| 欧美日韩国产免费一区二区三区 | 亚洲欧洲专线一区| 亚洲av无码片vr一区二区三区| 91视频国产一区| 亚洲性色精品一区二区在线| 亚洲日韩国产欧美一区二区三区| 亚洲AV香蕉一区区二区三区| 精品国产一区二区三区久久狼 | 亚洲福利一区二区| 国产精品视频分类一区| 在线电影一区二区三区| 一区二区三区精品视频| 亚洲永久无码3D动漫一区| 欧洲无码一区二区三区在线观看| 久久精品一区二区三区AV| 国产视频一区二区| 中文字幕AV一区中文字幕天堂|