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

MySQL關(guān)聯(lián)查詢優(yōu)化實現(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)化

我們準備如下兩個表,并插入數(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ù)進行對比(全表掃描),這個過程要要重復20次(type 表有20條數(shù)據(jù))。

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

我們?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+樹來講,其時間復雜度為logN,相比前面的全表掃描要快很多。

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

當然,給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)化實現(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)方案,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 淺談MySQL之淺入深出頁原理

    淺談MySQL之淺入深出頁原理

    首先,我們需要知道,頁(Pages)是InnoDB中管理數(shù)據(jù)的最小單元。Buffer Pool中存的就是一頁一頁的數(shù)據(jù)。當我們要查詢的數(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字符串拼接的幾種實用方式小結(jié)

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

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

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

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

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

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

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

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

    mysql最左前綴法則導致索引失效的解決

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

最新評論

邓州市| 乌拉特前旗| 拉萨市| 华阴市| 青岛市| 六盘水市| 建湖县| 清苑县| 鸡东县| 乌兰察布市| 延寿县| 大余县| 克东县| 和平区| 香格里拉县| 漯河市| 宁海县| 神农架林区| 河东区| 新龙县| 晋宁县| 孙吴县| 平乐县| 普洱| 安义县| 江孜县| 淅川县| 祁连县| 汪清县| 北票市| 金堂县| 神农架林区| 迭部县| 漳州市| 久治县| 宝坻区| 子洲县| 嵊州市| 澎湖县| 台江县| 呼和浩特市|