av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

淺談mysql join底層原理

瀏覽:2日期:2023-10-17 18:36:04
目錄join算法驅動表和非驅動表的區(qū)別1、Simple Nested-Loop Join,簡單嵌套-無索引的情況2、Index Nested-Loop Join-有索引的情況3、Block Nested-Loop Join ,join buffer緩沖區(qū)緩沖區(qū)大小數(shù)據(jù)量大的表和數(shù)據(jù)量小的表如何選擇連接順序細節(jié)join算法

mysql只支持一種join算法:Nested-Loop Join(嵌套循環(huán)連接),但Nested-Loop Join有三種變種:

Simple Nested-Loop Join,簡單嵌套 Index Nested-Loop Join,索引嵌套 Block Nested-Loop Join ,join buffer緩沖區(qū)嵌套(臨時表)驅動表和非驅動表的區(qū)別

驅動表就是主表,非驅動表就是從表,看以下sql就知道了,A就是驅動表,B就是非驅動表。

select * from A left join B

A join B 連表時,一定先查A表再查B表嗎?

答案是不一定,因為mysql內(nèi)部有一個優(yōu)化器,它會根據(jù)你查詢語句做一些優(yōu)化,先查哪張表也是由優(yōu)化器決定的,但可以肯定的是,先查詢的那張表就是驅動表,反之就是非驅動表;關于是那張表先查的問題,我們通過看執(zhí)行計劃來得出結果;在前面加上explain關鍵字即可;

explain select * from A join B;1、Simple Nested-Loop Join,簡單嵌套-無索引的情況

A left join B: ,每次都是全表匹配,A表的每行數(shù)據(jù)都全表匹配一次B表,也就是說,假如我A表有10條數(shù)據(jù),B表有1000條數(shù)據(jù),那么查詢的時候掃描次數(shù)就是10*1000,也就說查詢時需要掃描10000遍才能得出數(shù)據(jù);

淺談mysql join底層原理

2、Index Nested-Loop Join-有索引的情況

select * from A join B on A.id=B.id where A.id = 1:在查詢時,驅動表A會根據(jù)關聯(lián)字段的索引進行查找,當在索引上找到符合的值,在回表進行查詢,也就是說得匹配到索引后才會才會進行回表查詢;如果非驅動表B的關聯(lián)關聯(lián)字段B.id是主鍵的話,性能會非常高,如果不是主鍵,會進行多次回表查詢,先關聯(lián)索引,然后根據(jù)二級索引的主鍵id進行回表查詢,性能上比主鍵要慢;

淺談mysql join底層原理

3、Block Nested-Loop Join ,join buffer緩沖區(qū)

如果有索引,會選取Index Nested-Loop Join進行連表,如果join列沒有索引,就會采用Block Nested-Loop Join ,join buffer,在驅動表和非驅動表中間有個buffer的緩沖區(qū),在查詢時先將驅動表的數(shù)據(jù)緩存到buffer緩沖區(qū)內(nèi),然后批量與非驅動表進行匹配,這是一種將多次比較合并為一次比較的優(yōu)化方案,注意:這里緩存的不只是關聯(lián)表的列,select 后面的列也會緩存起來;

淺談mysql join底層原理

緩沖區(qū)大小

默認情況下buffer緩沖區(qū)join_biffer_size的容量為256k,如果說你的數(shù)據(jù)空間大于256k,就無法使用緩沖區(qū)了,轉為最簡單的循環(huán)嵌套Simple Nested-Loop Join,但是我們可以手動調整緩沖區(qū)大小來裝入大容量的數(shù)據(jù);查看join_biffer_size的sql:show variables like ’%join_biffer_size%’

數(shù)據(jù)量大的表和數(shù)據(jù)量小的表如何選擇連接順序

最好由小表去連接大表,這樣會減少掃描次數(shù);比如大表有1000條數(shù)據(jù),小表只有10條數(shù)據(jù),那么最好的連接方式為:小表 join 大表;為什么要這么做呢?

如果是大表 join 小表,假如我們的數(shù)據(jù)在大表的第999行,那么查詢數(shù)據(jù)的時候就至少得掃描999次才能查出來; 如果是小表 join 大表,假如我們的數(shù)據(jù)在小表的第9行,細節(jié) 連表查詢的時候,最好不要超過三張表,因為需要join的字段,數(shù)據(jù)類型必須一致 優(yōu)先使用內(nèi)連接來連表,外連接查詢數(shù)據(jù)消耗的性能比內(nèi)連接要高; 確保關聯(lián)查詢中on 后面的列或者 using()中的字段帶有索引,連表時可加快數(shù)據(jù)訪問

到此這篇關于淺談mysql join底層原理的文章就介紹到這了,更多相關mysql join底層原理內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網(wǎng)!

相關文章:
主站蜘蛛池模板: 国产www| 免费国产网站 | 国产精品av一区二区 | 日韩av在线免费播放 | 香蕉成人 | 天天拍天天操 | 午夜看看 | 91在线免费看 | 天天视频黄 | 色综合久久88 | 五月天久久久 | 精品国产毛片 | 免费不卡视频 | 精品国产999久久久免费 | 可以免费看黄的网站 | 长河落日 | 亚洲免费黄色 | 欧美日韩少妇 | 久久久久久网 | 亚洲在线播放 | 一区二区三区视频在线 | 国产午夜一区二区 | 国产欧美久久久 | 欧美日韩免费在线观看 | 欧美一区二区三区免费 | 在线观看免费av网站 | 日韩视频在线观看免费 | 91中文 | 国产午夜三级一区二区三 | 欧洲黄色录像 | 91成人精品 | 99这里只有精品 | 黄色影视在线观看 | 久久久久精 | 国产伦精品一区二区三区视频黑人 | 色婷婷导航 | 一级真人毛片 | 丁香激情五月 | 亚洲精品一区二区三 | 日本在线看片 | 中文字幕视频一区 |