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

解析MySQL?join查詢的原理

 更新時間:2022年01月27日 15:57:22   作者:CaptainCats  
這篇文章主要介紹了MySQL?join查詢的原理,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

MySQL用Nested-Loop Join算法實現(xiàn)join查詢

區(qū)分驅(qū)動表和被驅(qū)動表,以驅(qū)動表的結(jié)果集為循環(huán)的基礎(chǔ),訪問被驅(qū)動表過濾數(shù)據(jù),然后合并結(jié)果,驅(qū)動表在外循環(huán)、被驅(qū)動表在內(nèi)循環(huán)。
如果還有第三張參與join查詢的表,則以合并的結(jié)果為驅(qū)動表,第三張表作為被驅(qū)動表,以此類推。

left join中的左表是驅(qū)動表、右表是被驅(qū)動表,right join剛好相反。

Nested-Loop Join有三種實現(xiàn)

SNLJ

Simple Nested-Loop Join

假設(shè)A是驅(qū)動表,B是被驅(qū)動表。

這里會掃描A表,用A的結(jié)果集作為外循環(huán),
每循環(huán)一次,會掃描B表一遍(遍歷內(nèi)循環(huán))

A表有N行,B表有M行。

SNLJ的開銷如下(最大情況下):

掃描A表1次;
掃描B表N次。
總共讀取記錄數(shù):N + N * M。

為了專注于理解Nested-Loop Join,這里不討論帶where子句的情況,以下相同。

BNLJ

Block Nested-Loop Join

假設(shè)A是驅(qū)動表,B是被驅(qū)動表。

用來join的字段在被驅(qū)動表沒有建立索引

Join Buffer
MySQL會將驅(qū)動表結(jié)果集中(多條記錄)用來join的字段緩存到Join Buffer,
Join Buffer的特點是只需要掃描被驅(qū)動表一次,就能得到Join Buffer中所有記錄的匹配結(jié)果,
減少掃描的次數(shù)。

Join Buffer默認大小256k,會生成n-1個Join Buffer緩沖區(qū),n為參與join查詢的表數(shù)量。

A表有N行,B表有M行。

BNLJ的開銷如下(最大情況下):

掃描A表1次;
掃描B表X次;
X的大小取決于N、join字段的大小、Join Buffer的大小,通常X<<N。

INLJ

Index Nested-Loop Join

假設(shè)A是驅(qū)動表,B是被驅(qū)動表。

用來join的字段在被驅(qū)動表建立了索引

聚集索引

非聚集索引

在這里我們假設(shè)您已對MySQL的索引結(jié)構(gòu)有了一定的了解,
如果沒有的話,可以去看下:通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引

這里會掃描A表,用A的結(jié)果集作為外循環(huán),
然后通過B表的索引來檢索,不會遍歷B表。

A表有N行,B表有M行。

INLJ的開銷如下(最大情況下):

掃描A表1次;
通過B表索引檢索N次,成本比掃描B表N次會低很多;
回表:先找到非聚集索引,再找到聚集索引,會多一次磁盤IO。

NLJ優(yōu)先級

INLJ>BNLJ>SNLJ

如何優(yōu)化join查詢效率

盡量將小表作為驅(qū)動表,大表作為被驅(qū)動表;
為參加join的字段在被驅(qū)動表建立聚集索引,其次是非聚集索引;
盡可能減少join的字段數(shù)量,或者使用長度比較小的字段來join,這樣Join Buffer一次可以緩存更多條記錄。

inner join時,MySQL會自動將小表作為驅(qū)動表,大表作為被驅(qū)動表。

掃描整張表是成本非常高的操作。

到此這篇關(guān)于MySQL join查詢的原理的文章就介紹到這了,更多相關(guān)MySQL join查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql三種批量增加的性能分析

    mysql三種批量增加的性能分析

    最近在深入學習hibernate,在進行批量操作時,發(fā)現(xiàn)hibernate批量操作性能非常低.于是就想找一個性能較高的方法,在對jdbc、jdbcTemplate、hibernate進行測試后,發(fā)現(xiàn)jdbc的執(zhí)行效率是最高的,jdbcTemplate也很相近,hibernate就不考慮了,慘不忍睹啊
    2012-08-08
  • Mysql主從三種復(fù)制模式(異步復(fù)制,半同步復(fù)制,組復(fù)制)

    Mysql主從三種復(fù)制模式(異步復(fù)制,半同步復(fù)制,組復(fù)制)

    這篇文章主要介紹了Mysql主從三種復(fù)制模式(異步復(fù)制,半同步復(fù)制,組復(fù)制),MySQL異步復(fù)制是主從復(fù)制過程中默認的復(fù)制模式,下文簡單介紹,感興趣的朋友可以參考一下
    2022-08-08
  • gorm操作MySql數(shù)據(jù)庫的方法

    gorm操作MySql數(shù)據(jù)庫的方法

    這篇文章主要介紹了gorm操作MySql數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 深入mysql慢查詢設(shè)置的詳解

    深入mysql慢查詢設(shè)置的詳解

    本篇文章是對mysql慢查詢設(shè)置進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 記一次MySQL更新語句update的踩坑

    記一次MySQL更新語句update的踩坑

    這篇文章主要介紹了記一次MySQL更新語句update的踩坑,幫助大家更好的理解和使用MySQL的更新語句,感興趣的朋友可以了解下
    2020-11-11
  • MySQL數(shù)據(jù)庫JDBC編程詳解流程

    MySQL數(shù)據(jù)庫JDBC編程詳解流程

    JDBC是指Java數(shù)據(jù)庫連接,是一種標準Java應(yīng)用編程接口(?JAVA?API),用來連接?Java?編程語言和廣泛的數(shù)據(jù)庫。從根本上來說,JDBC?是一種規(guī)范,它提供了一套完整的接口,允許便攜式訪問到底層數(shù)據(jù)庫,本篇文章我們來了解MySQL連接JDBC的流程方法
    2022-01-01
  • mysql中ROW_FORMAT的選擇問題

    mysql中ROW_FORMAT的選擇問題

    這篇文章主要介紹了mysql中ROW_FORMAT的選擇問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別詳解

    MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別詳解

    in和exists是兩種常用的條件查詢關(guān)鍵字,兩種常用于子查詢,它們在某些情況下可以互換使用,但它們的工作方式和效率可能會有所不同,這篇文章主要給大家介紹了關(guān)于MySQL關(guān)鍵字IN與EXISTS的使用與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • mysql拆分字符串作為查詢條件的示例代碼

    mysql拆分字符串作為查詢條件的示例代碼

    本文主要介紹了mysql拆分字符串作為查詢條件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • mysql密碼忘記后如何修改密碼(2022年最新版詳細教程保姆級)

    mysql密碼忘記后如何修改密碼(2022年最新版詳細教程保姆級)

    因為長時間不操作mysql而忘記root密碼的朋友估計不在少數(shù),下面這篇文章主要給大家介紹了關(guān)于mysql密碼忘記后如何修改密碼的相關(guān)資料,本教程是2022年最新版詳細教程保姆級,需要的朋友可以參考下
    2022-04-04

最新評論

高要市| 乌拉特中旗| 张掖市| 吉木萨尔县| 威信县| 株洲县| 扶风县| 东台市| 商河县| 尼玛县| 桃园县| 阳高县| 卢湾区| 唐山市| 汾西县| 江华| 马鞍山市| 镇平县| 屏南县| 奉新县| 德庆县| 嘉荫县| 交城县| 泸水县| 沙洋县| 湖州市| 修文县| 南城县| 台北市| 万安县| 洮南市| 从江县| 治县。| 基隆市| 武夷山市| 阿克陶县| 来宾市| 木里| 连平县| 白河县| 漠河县|