驅動表與被驅動表
先了解在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表是被驅動表
測試:A表140多條數據,B表20萬左右的數據量
select * from A a left join B b on a.code=b.code
執行時間:7.5s
select * from B b left join A a on a.code=b.code
執行時間:19s
結論:小表驅動大表優於大表驅動小表
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萬條){
}
}
大表驅動小表:
for(20萬條){
for(140條){
}
}
大表驅動小表,要通過20萬次的連接
小表驅動小表,只需要通過140多次的連接就可以了
所以也可以得出結論
如果A表,B表數據量差不多大的時候,那么選擇誰作為驅動表也是無所謂了
忘了補充一句,也可以通過EXPLAIN分析來判斷在sql中誰是驅動表,EXPLAIN語句分析出來的第一行的表即是驅動表
結論
1.以小表驅動大表
2.給被驅動表建立索引
————————————————
本文來源於:https://blog.csdn.net/qq_20891495/article/details/93744495