條件:
a表100行資料
b表100行資料
假如 a join b on a.欄位1=b.欄位2
此時驅動表是a表,被驅動表示b表
1、假如b表上字段2建立了索引
那麼a表作為驅動表將會逐行掃瞄,掃瞄100次,b表上字段2有索引,因此a表每一行會讀b表的一行,這樣總掃瞄次數是100+100=200次
2、假如b表上的字段2沒有建立索引
那麼a表作為驅動表每一行掃瞄,b表上沒有索引,因此會逐行掃瞄,a的每一行對應b上的100行,索引總掃瞄次數是 100*100=10000次
block nested-loop join演算法 是在記憶體進行的
****** nested-loop join演算法不是在記憶體
結論:當第1中情況時,小表作為驅動表複雜度好很多。
當2種情況,哪乙個作為驅動表都一樣。
使用join_buffer 如果記憶體中放不下,策略是分段放,這也是block nested-loop 中block的由來。
join_buffer_size可以設定join的時候占用記憶體大小,預設256k
如果你的join語句很慢,就把join_buffer_size改大
能不能使用join語句?explain一下
1.如果可以使用index nested-loop join演算法,也就是說可以用上被驅動表上的索引,其實是沒問題的;
2.如果使用block nested-loop join演算法,掃瞄行數就會過多。尤其是在大表上的join操作,這樣可能要掃瞄被驅動表很多次,會占用大量的系統資源。所以這種join盡量不要用。
理解mysql中的join
1 兩表join時要小表驅動大表,為什麼?user表10000條資料,class表20條資料 select from user u left join class c on u.userid c.userid 上面的結果是迴圈10000次,每次獲取user的userid到class中找與user表u...
MySQL中的幾種join總結
an highlighted block join 建表語句 drop database if exists test create database test use test 左表t1 drop table if exists t1 create table t1 id int not null...
MySQL的JOIN(二) JOIN原理
nested loop join nlj 演算法 首先介紹一種基礎演算法 nlj,巢狀迴圈演算法。迴圈外層是驅動表,循壞內層是被驅動表。驅動表會驅動被驅動表進行連線操作。首先驅動表找到第一條記錄,然後從頭掃瞄被驅動表,逐一查詢與驅動表第一條記錄匹配的記錄然後連線起來形成結果表中的一條記。被驅動表查詢...