驅動表與被驅動表
先了解在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.給被驅動表建立索引