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

MySQL關(guān)聯(lián)查詢優(yōu)化實(shí)現(xiàn)方法詳解

 更新時間:2022年11月01日 11:53:55   作者:流煙默  
在數(shù)據(jù)庫的設(shè)計中, 我們通常都是會有很多張表 , 通過表與表之間的關(guān)系建立我們想要的數(shù)據(jù)關(guān)系, 所以在多張表的前提下, 多表的關(guān)聯(lián)查詢就尤為重要,這篇文章主要介紹了MySQL關(guān)聯(lián)查詢優(yōu)化

我們準(zhǔn)備如下兩個表,并插入數(shù)據(jù)。

#分類
CREATE TABLE IF NOT EXISTS `type` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`id`)
);
#圖書
CREATE TABLE IF NOT EXISTS `book` (
`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (`bookid`)
);

左外連接

首先我們分析SQL如下,type為驅(qū)動表(內(nèi)表),book為被驅(qū)動表(外表)。

EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

每次從type中獲取一條數(shù)據(jù)然后后book中的數(shù)據(jù)進(jìn)行對比(全表掃描),這個過程要要重復(fù)20次(type 表有20條數(shù)據(jù))。

這里可以看到,type均為all。另外還可以看到MySQL幫我們做了一個優(yōu)化,使用了join buffer進(jìn)行緩存。

我們?yōu)楸或?qū)動表 book.card 添加索引優(yōu)化

CREATE INDEX Y ON book(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

這里能夠看到,雖然type表仍舊是要處理20次,但是拿著type的數(shù)據(jù)去book中尋找時,走的是索引。對于B+樹來講,其時間復(fù)雜度為logN,相比前面的全表掃描要快很多。

也就是對于左外連接來講,如果只能添加一個索引,那么一定添加到被驅(qū)動表上。

當(dāng)然,給type的card頁創(chuàng)建索引也是可以的。

CREATE INDEX X ON `type`(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

如果索引只加在了驅(qū)動表(左表)呢?

DROP INDEX Y ON book;
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` LEFT JOIN book 
ON type.card = book.card;

可以看到,同樣使用了join buffer。而對于驅(qū)動表來講,即使用到了索引也要做一個整體的遍歷(無非這時走的是索引文件)。而被驅(qū)動表沒有索引,那么性能會相對較慢。

如下圖所示,從其查詢成本我們也可以看到顯著區(qū)別。

結(jié)論: 左(外)連接時,索引加在右表的連接字段。left join用于確定如何從右表搜索行,左表一定都有。同理,右(外)連接時,索引創(chuàng)建在左表的連接字段。該連接字段在兩個表中的數(shù)據(jù)類型保持一致。

此外,從上面Using where; Using join buffer (Block Nested Loop)我們也可以想到,如果有條件,那么join buffer給一個較大的容量是有助于提升性能的。

內(nèi)連接INNER JOIN

我們?nèi)サ羲饕?,然后查看?zhí)行計劃。

DROP INDEX X ON `type`;
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

我們給被驅(qū)動表 book.card 添加索引

CREATE INDEX Y ON book(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

我們再給驅(qū)動表type添加索引

CREATE INDEX X ON `type`(card);
EXPLAIN SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

可以看到這里二者均用到了索引。需要說明的是,這時type和book上下次序可能轉(zhuǎn)換,也就是說 對于inner join來講,查詢優(yōu)化器可以決定誰作為驅(qū)動表,誰作為被驅(qū)動表出現(xiàn)的 。

那如果book.card沒有索引,type.card 有索引呢?

DROP INDEX Y ON book;
EXPLAIN  SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

可以看到book作為了驅(qū)動表,type作為了被驅(qū)動表。即,對于內(nèi)連接來講,如果表的連接條件中只能有一個字段有索引,則有索引的字段所在的表會被作為被驅(qū)動表出現(xiàn)。

如果兩個表數(shù)據(jù)量不一致呢?比如這里我們type為40條,book為20條。

EXPLAIN  SELECT SQL_NO_CACHE * FROM `type` INNER JOIN book 
ON type.card = book.card;

結(jié)論: 對于內(nèi)連接來說,在兩個表的連接條件都存在索引的情況下,會選擇小表作為驅(qū)動表,即“小表驅(qū)動大表”。

到此這篇關(guān)于MySQL關(guān)聯(lián)查詢優(yōu)化實(shí)現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)MySQL關(guān)聯(lián)查詢優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL數(shù)據(jù)分表Mybatis?Plus動態(tài)表名優(yōu)方案

    SQL數(shù)據(jù)分表Mybatis?Plus動態(tài)表名優(yōu)方案

    這篇文章主要介紹了SQL數(shù)據(jù)分表Mybatis?Plus動態(tài)表名優(yōu)方案,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 淺談MySQL之淺入深出頁原理

    淺談MySQL之淺入深出頁原理

    首先,我們需要知道,頁(Pages)是InnoDB中管理數(shù)據(jù)的最小單元。Buffer Pool中存的就是一頁一頁的數(shù)據(jù)。當(dāng)我們要查詢的數(shù)據(jù)不在Buffer Pool中時,InnoDB會將記錄所在的頁整個加載到Buffer Pool中去;同樣,將Buffer Pool中的臟頁刷入磁盤時,也是按照頁為單位刷入磁盤的
    2021-06-06
  • MySql中怎樣查詢表是否被鎖

    MySql中怎樣查詢表是否被鎖

    這篇文章主要介紹了MySql中怎樣查詢表是否被鎖問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 優(yōu)化mysql的limit offset的例子

    優(yōu)化mysql的limit offset的例子

    在mysql中,通常使用limit做分頁,而且經(jīng)常會跟order by 連用。在order by 上加索引有時候是很有幫助的,不然系統(tǒng)會做很多的filesort
    2013-02-02
  • mysql合并多條記錄的單個字段去一條記錄編輯

    mysql合并多條記錄的單個字段去一條記錄編輯

    mysql怎么合并多條記錄的單個字段去一條記錄,今天在網(wǎng)上找了一下,方法如下
    2011-09-09
  • mysql字符串拼接的幾種實(shí)用方式小結(jié)

    mysql字符串拼接的幾種實(shí)用方式小結(jié)

    在SQL語句中經(jīng)常需要進(jìn)行字符串拼接,下面這篇文章主要給大家介紹了關(guān)于mysql字符串拼接的幾種實(shí)用方式,文中通過圖文以及代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • MySQL?索引從入門到精通示例詳解(核心概念、類型與實(shí)戰(zhàn)優(yōu)化)

    MySQL?索引從入門到精通示例詳解(核心概念、類型與實(shí)戰(zhàn)優(yōu)化)

    本文詳細(xì)介紹了MySQL索引的概念、類型及其在實(shí)際應(yīng)用中的優(yōu)化策略,索引可以顯著提升查詢效率,但過多的索引會增加寫操作的開銷,文章涵蓋了索引的創(chuàng)建、維護(hù)和使用技巧,幫助讀者更好地理解和應(yīng)用索引,以優(yōu)化數(shù)據(jù)庫性能,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • mysql自聯(lián)去重的一些筆記記錄

    mysql自聯(lián)去重的一些筆記記錄

    這篇文章主要給大家介紹了關(guān)于mysql自聯(lián)去重的一些筆記記錄,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on *.* to 'root'@'%' identified by '密碼' with grant optio報錯

    解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on&n

    這篇文章主要介紹了解決mysql數(shù)據(jù)庫設(shè)置遠(yuǎn)程連接權(quán)限執(zhí)行g(shù)rant all privileges on *.* to 'root'@'%' identified by '密碼' with grant optio報錯,通過本文給大家分享問題原因解析及解決方法,需要的朋友可以參考下
    2022-11-11
  • mysql最左前綴法則導(dǎo)致索引失效的解決

    mysql最左前綴法則導(dǎo)致索引失效的解決

    最左前綴是在使用innodb存儲引擎索引時,需要遵守的法則,本文主要介紹了mysql最左前綴法則導(dǎo)致索引失效的解決,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07

最新評論

蒲城县| 霍林郭勒市| 五河县| 淮南市| 遂平县| 娄底市| 碌曲县| 日喀则市| 项城市| 凯里市| 常德市| 五峰| 万载县| 台中市| 浦北县| 遂平县| 清水县| 固始县| 阿巴嘎旗| 谢通门县| 铜陵市| 荆州市| 茶陵县| 隆化县| 巴楚县| 绥滨县| 华池县| 富裕县| 金川县| 巧家县| 吐鲁番市| 临清市| 楚雄市| 麻栗坡县| 叶城县| 罗甸县| 白水县| 叙永县| 万山特区| 鄄城县| 张家港市|