1. 程式人生 > 其它 >mysql leftjoin 大表在外_小表驅動大表

mysql leftjoin 大表在外_小表驅動大表

前言
在資料庫查詢中,經常用到表關聯,聽到最多的規則是 “小表驅動大表”。那麼問題來了

什麼是小表驅動大表 ?

為什麼要用小表驅動大表 ?

怎麼區分那個是驅動表與被驅動表 ?

JOIN 查詢如何選擇驅動表與被驅動表 ?

索引應該建在驅動表還是被驅動表 ?

  1. 什麼是小表驅動大表 ?

小表驅動大表指的是用小的資料集驅動大的資料集。

  1. 為什麼要用小表驅動大表 ?
    例如:現有兩個表 A 與 B ,表 A 有 200 條資料,表 B 有 20 萬條資料 ;
    按照迴圈的概念舉個例子

小表驅動大表 > A 驅動表,B 被驅動表

for(200 條){for(20 萬條){...}}
大表驅動小表 > B 驅動表,A 被驅動表

for(20 萬){for(200 條){...}}
總結:

如果小的迴圈在外層,對於表連線來說就只連線 200 次 ;

如果大的迴圈在外層,則需要進行 20 萬次表連線,從而浪費資源,增加消耗 ;

綜上:
小表驅動大表的主要目的是通過減少表連線建立的次數,加快查詢速度 。

  1. 怎麼區分那個是驅動表與被驅動表 ?
    通過 EXPLAIN 檢視 SQL 語句的執行計劃可以判斷在誰是驅動表,EXPLAIN 語句分析出來的第一行的表即是驅動表 ;

  2. JOIN 查詢如何選擇驅動表與被驅動表 ?
    在 JOIN 查詢中經常用到的 inner join、left join、right join
    問題解答:

1.當使用 left join 時,左表是驅動表,右表是被驅動表 ;

2.當使用 right join 時,右表時驅動表,左表是驅動表 ;

3.當使用 inner join 時,mysql 會選擇資料量比較小的表作為驅動表,大表作為被驅動表 ;

測試結論:

測試環境配置:MYSQL 5.7

資料準備:

建立兩張測試表
大表 user_big_info ,測試資料 400 萬條, 小表 user_small_info ,測試資料 200 萬條 ;

CREATE TABLE `user_small_info` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',  `user_id` varchar(32) NOT NULL COMMENT '使用者唯一標識',  `username` varchar(32) NOT NULL DEFAULT '' COMMENT '使用者名稱',  `password` varchar(255) NOT NULL DEFAULT '' COMMENT '密碼',  `real_name` varchar(32) NOT NULL DEFAULT '' COMMENT '真實姓名',  `phone` varchar(32) NOT NULL DEFAULT '' COMMENT '手機號碼',  `remarks` varchar(255) NOT NULL DEFAULT '' COMMENT '備註',  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態 1-啟用 2-禁用 ',  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',  PRIMARY KEY (`id`),  UNIQUE KEY `uniq_user_id` (`user_id`) USING BTREE,  KEY `idx_username` (`username`) USING BTREE) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='使用者表';

LEFT JOIN 測試

小表驅動大表

執行時間:18.141s ,由於使用左連線以小表為主表所以,返回行數:200 萬
執行計劃

大表驅動小表

執行時間:25.949s ,由於使用左連線以大表為主表所以,返回行數: 400 萬
執行計劃

結論:

當使用 left join 時,左表是驅動表,右表是被驅動表 ; ;

在執行效率上,小表驅動大表優於大表驅動小表 ;

驅動表索引沒有生效,被驅動表索引有效 ;

INNER JOIN 測試
小表驅動大表

執行時間:18.660s ,等值連線返回行數:200 萬

執行計劃

大表驅動小表

執行時間:19.060s ,等值連線返回行數:200 萬

執行計劃

結論:

當使用 inner join 時,資料庫會選擇資料量比較小的表作為驅動表,大表作為被驅動表 ;

在執行效率上,那個作為主表關係不大,執行效率差距不大 ;

驅動表索引沒有生效,被驅動表索引有效 ;
————————————————
版權宣告:本文為 CSDN 博主「weixin_39634876」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/weixin_39634876/article/details/111698250