1.看explain的結果,如果extra欄位裡面出現「block nested loop」 即這時候sql查詢使用block nested-loop join演算法,就意味著效能較差,不建議使用。
2.join連線中盡可能使用小表做驅動表
通過下面的join語句分別分析一下幾種join連線演算法的過程和效能select * from a inner join b on a.id=b.no如果上面sql中的b表的no欄位是索引字段,那麼查詢過程可以用上被驅動表的索引,這時候sql查詢使用index nested-loopjoin演算法。 這個演算法關鍵在於檢索過程中可以使用被驅動表的索引。
index nested-loopjoin演算法是join連線最優的join演算法,如果使用join查詢盡量使sql按照此演算法執行才能保證效能。流程如下:
如果不用join連線要實現同樣的效果,通常就是拆分sql查詢兩次的方式1.查詢select * from a
2.遍歷1中的結果取出a.id記為id
3.使用a.id作為條件執行select * from b where b.no=id
4.重複執行3查詢
上面的過程與上面index nested-loopjoin演算法的實現區別是sql執行了多次,多執行的次數取決於a表的行數。效能是不如index nested-loopjoin演算法的join連線的。
如果上面sql中的b表的no欄位不是索引,這時候sql查詢使用block nested-loop join演算法。
這時候,被驅動表上沒有可用的索引,演算法的流程是這樣的:
可以看到上面的流程相對於演算法來說,掃瞄了b表全表導致效能差了很多。不僅如此,當驅動表是大表時效能也會受到join_buffer的影響。join_buffer的大小是由引數join_buffer_size設定的,預設值是256k。
如果在執行上面的sql時,join_buffer中放不下表a的所有數 據話,就會分段放。這時候由於表a被分成了兩次放入join_buffer中,導致表b會被掃瞄兩次。
Mysql 的連線(join)和子查詢
連線 join 和子查詢 子查詢一般是將查詢出來的結果作為其他查詢的結果使用。例如,我們要將客戶基本資訊表中沒有任何訂單的客戶刪除掉,就可以利用子查詢先從銷售資訊表中將所有發出訂單的客戶id取出來,然後將結果傳遞給主查詢,如下所示 delete from customerinfo where cus...
mysql各種join連線查詢
注意點 在join操作中的 on where 應該放哪些條件 目前理解 on 後放2表關聯部分 where後放最終資料篩選部分 1.下圖為各種join操作的圖表解釋及sql語句 2.自測 建表資料結果如下 可以根據圖表中的sql 語句進行相關join查詢測試 3.簡單測試2個結果 測試第乙個join...
mysql的join連線查詢
join 聯合查詢。查詢的結果左右連線。連成一張大表。場景 一張表裡面的資訊不能滿足我們的條件這時候可以把有關聯的表連線起來。方便查詢。別名 分為表別名和列別名。因為有些資料表的表名很長並且會用很多次所以我們可以給它起乙個簡單的別名,簡便而且 也少。列別名主要是有相同欄位時可以加以區分。例如需要從兩...