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

淺談mysql join底層原理

 更新時(shí)間:2021年08月03日 09:37:47   作者:java葉新東老師  
本文文章主要介紹了淺談mysql join底層原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(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ū)嵌套(臨時(shí)表)

驅(qū)動(dòng)表和非驅(qū)動(dòng)表的區(qū)別

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

select * from A left join B

A join B 連表時(shí),一定先查A表再查B表嗎?

答案是不一定,因?yàn)閙ysql內(nèi)部有一個(gè)優(yōu)化器,它會(huì)根據(jù)你查詢語句做一些優(yōu)化,先查哪張表也是由優(yōu)化器決定的,但可以肯定的是,先查詢的那張表就是驅(qū)動(dòng)表,反之就是非驅(qū)動(dòng)表;關(guān)于是那張表先查的問題,我們通過看執(zhí)行計(jì)劃來得出結(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í)候掃描次數(shù)就是10*1000,也就說查詢時(shí)需要掃描10000遍才能得出數(shù)據(jù);

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

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

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

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

緩沖區(qū)大小

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

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

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

  • 如果是大表 join 小表,假如我們的數(shù)據(jù)在大表的第999行,那么查詢數(shù)據(jù)的時(shí)候就至少得掃描999次才能查出來;
  • 如果是小表 join 大表,假如我們的數(shù)據(jù)在小表的第9行,

細(xì)節(jié)

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

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

相關(guān)文章

  • mysql數(shù)據(jù)庫日志binlog保存時(shí)效問題(expire_logs_days)

    mysql數(shù)據(jù)庫日志binlog保存時(shí)效問題(expire_logs_days)

    這篇文章主要介紹了mysql數(shù)據(jù)庫日志binlog保存時(shí)效問題(expire_logs_days),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • windows10安裝mysql5.7.18教程

    windows10安裝mysql5.7.18教程

    windows10安裝mysql5.7.18是這樣安裝的嗎?這篇文章主要為大家詳細(xì)介紹了win10下mysql5.7.18安裝配置方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 在MySQL中奏響數(shù)據(jù)庫操作的樂章(推薦)

    在MySQL中奏響數(shù)據(jù)庫操作的樂章(推薦)

    本文詳細(xì)介紹了如何在MySQL中進(jìn)行數(shù)據(jù)庫操作,包括創(chuàng)建、刪除、修改數(shù)據(jù)庫等,以及如何使用字符集和校驗(yàn)規(guī)則,以及備份和恢復(fù)數(shù)據(jù)庫的方法,同時(shí),還討論了如何查看和修改數(shù)據(jù)庫的結(jié)構(gòu)和數(shù)據(jù),總的來說,本文為讀者提供了一份全面的MySQL數(shù)據(jù)庫操作指南
    2024-10-10
  • mySQL中in查詢與exists查詢的區(qū)別小結(jié)

    mySQL中in查詢與exists查詢的區(qū)別小結(jié)

    最近被一個(gè)朋友問到mySQL中in查詢和exists的區(qū)別,當(dāng)然只是草草的回答了下,今天偶然看到了一篇關(guān)于mysql中的exists查詢的文章,讀完感覺太”冷落”它了,這里總結(jié)一下,也跟自己常用的in查詢做一下對(duì)比。有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理

    MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理

    今天小編就為大家分享一篇關(guān)于MySQL存儲(chǔ)引擎MyISAM與InnoDB區(qū)別總結(jié)整理,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Access數(shù)據(jù)庫的存儲(chǔ)上限

    Access數(shù)據(jù)庫的存儲(chǔ)上限

    Access數(shù)據(jù)庫的存儲(chǔ)上限...
    2006-09-09
  • MySql服務(wù)器系統(tǒng)變量和狀態(tài)變量介紹

    MySql服務(wù)器系統(tǒng)變量和狀態(tài)變量介紹

    這篇文章主要介紹了MySql服務(wù)器系統(tǒng)變量和狀態(tài)變量介紹,本文分別講解了它們的作用、設(shè)置方法和獲取方法,需要的朋友可以參考下
    2014-12-12
  • 詳解如何使用DockerHub官方的MySQL鏡像

    詳解如何使用DockerHub官方的MySQL鏡像

    MySQL是一個(gè)廣泛使用的開源關(guān)系型數(shù)據(jù)庫,那如何獲取Mysql Docker鏡像?下面通過這篇文章來一起看看如何使用DockerHub官方的MySQL鏡像,有需要的朋友們可以參考借鑒。
    2016-12-12
  • 深入了解MySQL ClickHouse中的物化視圖功能

    深入了解MySQL ClickHouse中的物化視圖功能

    MapReduce是一種用于處理大規(guī)模數(shù)據(jù)集的并行編程模型,其特點(diǎn)高效性和可擴(kuò)展性,這篇文章主要介紹了MySQL ClickHouse中的物化視圖功能,需要詳細(xì)了解可以參考下文
    2023-05-05
  • MySQL基礎(chǔ)入門教程之事務(wù)

    MySQL基礎(chǔ)入門教程之事務(wù)

    事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL基礎(chǔ)入門教程之事務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

安阳市| 安泽县| 永福县| 乌什县| 天长市| 新疆| 鲜城| 伊宁市| 朔州市| 邹城市| 土默特右旗| 昌黎县| 富源县| 襄樊市| 开封县| 新乐市| 榕江县| 巩义市| 平顺县| 姚安县| 铅山县| 且末县| 句容市| 全南县| 凤翔县| 界首市| 资源县| 深州市| 新邵县| 石林| 雷州市| 鞍山市| 衡阳县| 噶尔县| 临泉县| 乐陵市| 连城县| 讷河市| 锦屏县| 叶城县| 崇明县|