MySQL 驅動表和被驅動表

2021-09-28 23:15:39 字數 1114 閱讀 9056

先了解在join連線時哪個表是驅動表,哪個表是被驅動表:

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

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

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

join查詢如何選擇驅動表與被驅動表

在sql優化中,永遠是以小表驅動大表。

例如: a是小表,b是大表

使用left join 時,則應該這樣寫select * from a a left join b b on a.code=b.code

a表時驅動表,b表是被驅動表

結論:小表驅動大表優於大表驅動小表

join查詢在有索引條件下

驅動表有索引不會使用到索引

被驅動表建立索引會使用到索引

在以小表驅動大表的情況下,再給大表建立索引會大大提高執行速度

測試:給a表,b表建立索引

分析:explain select * from a a left join b b on a.code=b.code

只有b表code使用到索引

如果只給a表的code建立索引會是什麼情況?

在這種情況下,a表索引失效

結論:給被驅動表建立索引

驅動表的含義

mysql 表關聯的演算法是 nest loop join,是通過驅動表的結果集作為迴圈基礎資料,然後一條一條地通過該結果集中的資料作為過濾條件到下乙個表中查詢資料

,然後合併結果。如果還有第三個參與join,則再通過前兩個表的join結果集作為迴圈基礎資料,再一次通過迴圈查詢條件到第三個表中查詢資料,如此往復。

例如:小表驅動大表:

for(140條)

}大表驅動小表:

for(20萬條)

}大表驅動小表,要通過20萬次的連線

小表驅動小表,只需要通過140多次的連線就可以了

所以也可以得出結論

如果a表,b表資料量差不多大的時候,那麼選擇誰作為驅動表也是無所謂了

忘了補充一句,也可以通過explain分析來判斷在sql中誰是驅動表,explain語句分析出來的第一行的錶即是驅動表

結論1.以小表驅動大表

2.給被驅動表建立索引

oracle驅動表被驅動表

一般情況下,在兩表連線時,表記錄條數較少的會被作為驅動表,根據每乙個驅動表的記錄,去匹配被驅動表的所有滿足條件的資料。如果是這種掃瞄方式,那麼這裡問題就來了,為什麼說條數較少的表作為驅動表,效率就一定高呢?下面實驗 先實驗一般情況 建表create table a id number,name ch...

mysql 大表 驅動 MySQL小表驅動大表

在了解之前要先了解對應語法 in 與 exist。in後的括號的表示式結果要求先輸出一列字段。與之前的搜尋字段匹配,匹配到相同則返回對應行。mysql的執行順序是先執行子查詢,然後執行主查詢,用子查詢的結果按條匹配主查詢。exist後的括號裡則無輸出要求,exist判斷後面的結果集中有沒有行,有行則...

MySQL 小表驅動大表

小表驅動大表 準備兩站表 create table student id int 11 notnull,no varchar 20 default null name varchar 20 default null primary key id engine innodb default chars...