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

淺談mysql join底層原理

 更新時間:2021年08月03日 09:37:47   作者:java葉新東老師  
本文文章主要介紹了淺談mysql join底層原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

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ū)動表和非驅(qū)動表的區(qū)別

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

select * from A left join B

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

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

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ù);

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

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

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

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

緩沖區(qū)大小

默認(rèn)情況下buffer緩沖區(qū)join_biffer_size的容量為256k,如果說你的數(shù)據(jù)空間大于256k,就無法使用緩沖區(qū)了,轉(zhuǎn)為最簡單的循環(huán)嵌套Simple Nested-Loop Join,但是我們可以手動調(diào)整緩沖區(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行,

細(xì)節(jié)

  • 連表查詢的時候,最好不要超過三張表,因為需要join的字段,數(shù)據(jù)類型必須一致
  • 優(yōu)先使用內(nèi)連接來連表,外連接查詢數(shù)據(jù)消耗的性能比內(nèi)連接要高;
  • 確保關(guān)聯(lián)查詢中on 后面的列或者 using()中的字段帶有索引,連表時可加快數(shù)據(jù)訪問

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

相關(guān)文章

  • Mysql動態(tài)更新數(shù)據(jù)庫腳本的示例講解

    Mysql動態(tài)更新數(shù)據(jù)庫腳本的示例講解

    今天小編就為大家分享一篇關(guān)于Mysql動態(tài)更新數(shù)據(jù)庫腳本的示例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Mysql索引分類及其使用實例詳解

    Mysql索引分類及其使用實例詳解

    數(shù)據(jù)庫的索引就像一本書的目錄,能夠加快數(shù)據(jù)庫的查詢速度,MYSQL索引有四種PRIMARY、INDEX、UNIQUE、FULLTEXT,?其中PRIMARY、INDEX、UNIQUE是一類,F(xiàn)ULLTEXT是一類,本文給大家介紹Mysql索引分類及其使用實例,感興趣的朋友一起看看吧
    2022-07-07
  • mysql中合并兩個字段的方法分享

    mysql中合并兩個字段的方法分享

    mysql中怎么合并兩個字段為一個字段呢?試了好多方法,結(jié)果還是不是我想要的
    2012-08-08
  • MySQL計劃任務(wù)(事件調(diào)度器) Event Scheduler介紹

    MySQL計劃任務(wù)(事件調(diào)度器) Event Scheduler介紹

    MySQL5.1.x版本中引入了一項新特性EVENT,顧名思義就是事件、定時任務(wù)機(jī)制,在指定的時間單元內(nèi)執(zhí)行特定的任務(wù),因此今后一些對數(shù)據(jù)定時性操作不再依賴外部程序,而直接使用數(shù)據(jù)庫本身提供的功能
    2013-10-10
  • MySQL數(shù)據(jù)類型優(yōu)化原則

    MySQL數(shù)據(jù)類型優(yōu)化原則

    這篇文章主要介紹了MySQL數(shù)據(jù)類型優(yōu)化原則的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-11-11
  • mysql與mysqli的區(qū)別與用法說明

    mysql與mysqli的區(qū)別與用法說明

    mysql是非持繼連接函數(shù)而mysqli是永遠(yuǎn)連接函數(shù)。
    2010-07-07
  • mysql對binlog的處理說明

    mysql對binlog的處理說明

    Mysql和其它開源數(shù)據(jù)庫相比,具有更好的擴(kuò)展性。其主要原因是它提供了存儲引擎的開放接口。喜歡自己折騰數(shù)據(jù)庫的程序員可以從這個接口起步,打造有個性的數(shù)據(jù)庫。
    2011-07-07
  • MySQL修改root密碼的3種實用方法

    MySQL修改root密碼的3種實用方法

    最近在看項目,搭建本地環(huán)境時候,忘記mysql的密碼,怎么修改密碼,網(wǎng)上找了半天,終于配合著幾個帖子搞定了,下面這篇文章主要給大家介紹了關(guān)于MySQL修改root密碼的3種實用方法,需要的朋友可以參考下
    2023-11-11
  • 在MySQL中同時查找兩張表中的數(shù)據(jù)的示例

    在MySQL中同時查找兩張表中的數(shù)據(jù)的示例

    這篇文章主要介紹了在MySQL中同時查找兩張表中的數(shù)據(jù)的示例,即一次查詢操作返回兩張表的結(jié)果,需要的朋友可以參考下
    2015-07-07
  • MYSQL跨服務(wù)器同步數(shù)據(jù)經(jīng)驗分享

    MYSQL跨服務(wù)器同步數(shù)據(jù)經(jīng)驗分享

    這篇文章主要介紹了MYSQL跨服務(wù)器同步數(shù)據(jù)詳細(xì)過程,需要的朋友可以參考下
    2014-03-03

最新評論