驅動表與被驅動表mysql
先了解在join鏈接時哪一個表是驅動表,哪一個表是被驅動表:
1.當使用left join時,左表是驅動表,右表是被驅動表
2.當使用right join時,右表時驅動表,左表是驅動表
3.當使用join時,mysql會選擇數據量比較小的表做爲驅動表,大表做爲被驅動表算法
join查詢如何選擇驅動表與被驅動表sql
在sql優化中,永遠是以小表驅動大表。oop
例如: 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
執行時間:19sspa
結論:小表驅動大表優於大表驅動小表.net
join查詢在有索引條件下
驅動表有索引不會使用到索引
被驅動表創建索引會使用到索引code
在以小表驅動大表的狀況下,再給大表創建索引會大大提升執行速度blog
測試:給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