欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中的驅(qū)動表與被驅(qū)動表及含義

 更新時間:2023年10月13日 14:10:08   作者:明年就當百萬富翁  
使用join連接查詢時如果有where條件,則MySQL執(zhí)行器會根據(jù)查詢條件過濾后的結(jié)果自動選擇驅(qū)動表或被驅(qū)動表,這篇文章主要介紹了MySQL的驅(qū)動表與被驅(qū)動表,需要的朋友可以參考下

驅(qū)動表與被驅(qū)動表的含義

在MySQL中進行多表聯(lián)合查詢時,MySQL會通過驅(qū)動表的結(jié)果集作為基礎(chǔ)數(shù)據(jù),在被驅(qū)動表中匹配對應(yīng)的數(shù)據(jù),匹配成功合并后的臨時表再作為驅(qū)動表或被驅(qū)動表繼續(xù)與第三張表進行匹配合并,直到所有表都已匹配完畢,最后將結(jié)果返回出來。匹配算法:Nested-Loop Join(嵌套循環(huán)連接),在MySQL中有三種具體的實現(xiàn)算法:

  • Simple Nested-Loop Join:簡單嵌套循環(huán)連接
  • Index Nested-Loop Join:索引嵌套循環(huán)鏈接
  • Block Nested-Loop Join:緩存快嵌套循環(huán)鏈接

Simple Nested-Loop Join

簡單嵌套循環(huán)連接實際上就是簡單粗暴的嵌套循環(huán),如果驅(qū)動表有100條數(shù)據(jù),被驅(qū)動表有100條數(shù)據(jù),那么在匹配時會將驅(qū)動表的每一條數(shù)據(jù)作為匹配條件去被驅(qū)動表中逐個比較,實際上就要比較100*100=10000次,可以想象這種比較效率是非常低下的。

Index Nested-Loop Join

索引嵌套循環(huán)連接是基于被驅(qū)動表的索引進行連接的算法,通過驅(qū)動表的匹配條件與被驅(qū)動表的索引進行匹配,避免和每條記錄比較,從而利用索引的查詢減少匹配次數(shù),提高查詢的性能。但要注意的是被驅(qū)動表的關(guān)聯(lián)條件必須要有索引時才能用到Index Nested-Loop Join。另外由于用到索引,如果是非聚簇索引并且查詢的數(shù)據(jù)包含了被驅(qū)動表的其他字段,則會回到被驅(qū)動表再查詢一次對應(yīng)的數(shù)據(jù),即回表,多了IO操作。

Block Nested-Loop Join

緩存嵌套循環(huán)連接通過一次性緩存多條驅(qū)動表數(shù)據(jù)、參與查詢的列到Join Buffer里,然后拿Join Buffer里的數(shù)據(jù)批量與被驅(qū)動表中的數(shù)據(jù)進行比較,從而減少了循環(huán)匹配次數(shù)。

關(guān)于Join Buffer

Join Buffer會緩存所有參與查詢的列,而不是只有Join的匹配列

可以調(diào)整MySQL的join_buffer_size緩存大小,join_buffer_size的默認值是256K,最大值在MySQL 5.1.22版本前是4G,而之后的版本才能在64位操作系統(tǒng)下申請大于4G的空間

要使用Block Nested-Loop Join算法需要開啟優(yōu)化器管理配置的optimizer_switch的設(shè)置block_nested_loop為on,默認為on

當查詢優(yōu)化器不使用Index Nested-Loop Join算法的時候,默認使用Block Nested-Loop Join算法。

聯(lián)合查詢的性能優(yōu)化原則

明白聯(lián)合查詢的原理是驅(qū)動表與被驅(qū)動表通過條件嵌套循環(huán)連接匹配后,查詢性能優(yōu)化的思路就是:減少循環(huán)比較次數(shù)??梢酝ㄟ^以下幾個原則來進行優(yōu)化。

1. 以數(shù)據(jù)量小的表作為驅(qū)動表,數(shù)據(jù)量大的表作為被驅(qū)動表。

通過上面的分析可以得知,MySQL在聯(lián)合查詢中是用驅(qū)動表的數(shù)據(jù)作為篩選條件在被驅(qū)動表中進行匹配,所以假設(shè)table1作為驅(qū)動表,數(shù)據(jù)有10000條,table2作為被驅(qū)動表的數(shù)據(jù)有100條,并且被table2中有索引,那么用Index Nested-Loop Join算法進行匹配時要進行10000次的關(guān)聯(lián)操作。但如果反過來用table2作為驅(qū)動表,table1作為被驅(qū)動表,只需要進行100次關(guān)聯(lián)即可完成匹配,效率也會大大提高,其他的連接算法也類似。簡單說通常情況下要用小表驅(qū)動大表。
但是這里的小表和大表是根據(jù)查詢條件相對而言的,大小的計算是要根據(jù)查詢條件和具體的字段進行衡量,假如查詢條件指定了table1的搜索范圍,即table1滿足查詢條件的行數(shù)有90行,那么計算公式為:90乘以參與關(guān)聯(lián)查詢字段的大小總和,若結(jié)果小于table2滿足查詢條件后的行數(shù)乘以參與關(guān)聯(lián)查詢字段的大小,則table1為小表,否則table1為大表。

2. 為匹配的條件增加索引

匹配的條件字段列盡量使用有索引的,爭取使用Index Nested-Loop Join算法進行關(guān)聯(lián),減少被驅(qū)動表的循環(huán)次數(shù)

3. 增大join_buffer_size的大小

當使用Block Nested-Loop Join算法時,增大join_buffer_size的大小可以使驅(qū)動表一次緩存更多的數(shù)據(jù),從而減少總體循環(huán)匹配的次數(shù)

4. 減少不必要的字段查詢

  • 當用到Block Nested-Loop Join算法時,字段越少,join Buffer所緩存的數(shù)據(jù)就越多,那么循環(huán)的次數(shù)就越少。
  • 當用到Index Nested-Loop Join算法時,如果可以不回表查詢,即只查詢索引列,利用覆蓋索引則可能提升匹配效率

如何確定驅(qū)動表與被驅(qū)動表

  • 在使用join連接并且無where條件時:

    left join左邊的表為驅(qū)動表,右邊的為被驅(qū)動表

    right join右邊的表為驅(qū)動表,左邊的為被驅(qū)動表

    使用join時,MySQL會自動判斷左右兩邊哪邊是小表,哪邊是大表。小表作為驅(qū)動表,大表作為被驅(qū)動表,小表與大表的判斷原則為上面講到的根據(jù)行數(shù)和參與關(guān)聯(lián)的字段計算得出。

  • 在使用in\exists時

    使用in時,驅(qū)動表和被驅(qū)動表由MySQL的執(zhí)行器根據(jù)表的大小自動選擇

    使用exists時,外部表為驅(qū)動表,內(nèi)部表為被驅(qū)動表。無論加什么查詢條件都無法改變

使用join連接查詢時如果有where條件,則MySQL執(zhí)行器會根據(jù)查詢條件過濾后的結(jié)果自動選擇驅(qū)動表或被驅(qū)動表。

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

相關(guān)文章

  • MySQL 外鍵(FOREIGN KEY)用法案例詳解

    MySQL 外鍵(FOREIGN KEY)用法案例詳解

    這篇文章主要介紹了MySQL 外鍵(FOREIGN KEY)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細過程

    利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細過程

    總是遇到mysql服務(wù)意外斷開之后導(dǎo)致mysql服務(wù)無法正常運行的情況,使用Navicat工具查看能夠看到里面的庫和表,但是無法獲取數(shù)據(jù)記錄,提示數(shù)據(jù)表不存在,所以本文給大家介紹了利用frm和ibd文件恢復(fù)mysql表數(shù)據(jù)的詳細過程,需要的朋友可以參考下
    2024-04-04
  • MySQL查詢in操作 查詢結(jié)果按in集合順序顯示

    MySQL查詢in操作 查詢結(jié)果按in集合順序顯示

    MySQL 查詢in操作,查詢結(jié)果按in集合順序顯示的實現(xiàn)代碼,需要的朋友可以參考下。
    2010-12-12
  • MySQL分組的時候遇到ONLY_FULL_GROUP_BY報錯問題及解決方案

    MySQL分組的時候遇到ONLY_FULL_GROUP_BY報錯問題及解決方案

    這篇文章主要介紹了MySQL分組的時候遇到ONLY_FULL_GROUP_BY報錯問題及解決方案,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 一文搞懂MySQL索引所有知識點

    一文搞懂MySQL索引所有知識點

    這篇文章主要帶你搞懂MySQL索引的所有知識點,我們通常所說的索引,包括聚焦索引、覆蓋索引、組合索引、前綴索引、唯一索引等,沒有特別說明,默認都是使用B+樹結(jié)構(gòu)組織,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • MySQL中庫的基本操作指南(推薦!)

    MySQL中庫的基本操作指南(推薦!)

    MySQL這個數(shù)據(jù)庫是一個客戶端-服務(wù)器結(jié)構(gòu)的程序,下面這篇文章主要給大家介紹了關(guān)于MySQL中庫的基本操作指南,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • 淺談MySQL數(shù)據(jù)查詢太多會OOM嗎

    淺談MySQL數(shù)據(jù)查詢太多會OOM嗎

    本文主要介紹了淺談MySQL數(shù)據(jù)查詢太多會OOM嗎?文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • mysql 數(shù)據(jù)庫安裝經(jīng)驗問題匯總

    mysql 數(shù)據(jù)庫安裝經(jīng)驗問題匯總

    這篇文章主要介紹了mysql 數(shù)據(jù)庫安裝經(jīng)驗問題匯總,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Mysql如何刪除數(shù)據(jù)庫表中的某一列

    Mysql如何刪除數(shù)據(jù)庫表中的某一列

    這篇文章主要介紹了Mysql如何刪除數(shù)據(jù)庫表中的某一列,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法

    在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法

    這篇文章主要介紹了在MySQL中創(chuàng)建帶有IN和OUT參數(shù)的存儲過程的方法,在一定程度上簡化了操作,需要的朋友可以參考下
    2015-06-06

最新評論