Mysql表關聯的兩種演算法

2021-10-08 20:02:21 字數 969 閱讀 8955

mysql表關聯常見的有兩種演算法:

巢狀迴圈連線 nested-loop join(nlj) 演算法

基於塊的巢狀迴圈連線 block nested-loop join(bnl)演算法

巢狀迴圈連線 nested-loop join(nlj) 演算法:

適用於關聯的兩個欄位都為索引的情況下,首先會查詢出全部驅動表的關聯字段,然後一一去和被驅動表關聯,直至全部關聯完成。

基於塊的巢狀迴圈連線 block nested-loop join(bnl)演算法:

如果關聯字段不是索引或者有乙個字段不是索引,mysql則會採用此演算法,和nlj不同的是,bnl演算法會多加乙個join_buffer快取塊,關聯時會把驅動表的部分資料放入到快取塊中,然後用被驅動表一一對比,直至查詢完成。但是這個join_buffer快取塊是無序的,所以查詢對比的次數會很多。

對於關聯sql的優化:

關聯欄位加索引,讓mysql做join操作時盡量選擇nlj演算法

小標驅動大表,mysql這裡會自動判斷,如果寫sql時明確知道哪張表可作為驅動表,可使用straight_join寫法固定連線驅動方式,省去 mysql優化器自己判斷的時間,定要慎重,因 為部分情況下人為指定的執行順序並不一定會比優化引擎要靠譜。

straight_join解釋:straight_join功能同join類似,但能讓左邊的表來驅動右邊的表,能改表優化器對於聯表查詢的執 行順序。

區分兩種演算法:

至於一條sql語句使用什麼演算法去做的關聯操作,使用explain命令可以檢視,下面為巢狀迴圈連線演算法:

基於塊的巢狀迴圈連線 block nested-loop join(bnl)演算法:

mysql的兩種引擎 mysql的兩種儲存引擎

背景 最近在使用spring data jpa操作mysql,在使用jpa的自動建表功能之後,處理多對多關係 manytomany的時候,spring data jpa會給中間表的兩個欄位都加上外來鍵引用。當前使用的版本預設的資料庫儲存引擎為myisam。這種儲存引擎是為資料庫查詢效能而生的,不支援...

mybaits兩種關聯查詢

關聯查詢分兩種 1,用乙個總的sql搞定 這種關聯體現在collect用的是標籤,sql中查詢主實體,被關聯實體 由於在乙個sql中,注意兩個實體 查詢結果集 中欄位名不能一樣 一樣的化會在用pagehelper等自動裝配的語句出問題 未明確定義列 還有就是如果id一樣會導致多方只查到乙個 此方法看...

mybaits兩種關聯查詢

關聯查詢分兩種 1,用乙個總的sql搞定 這種關聯體現在collect用的是標籤,sql中查詢主實體,被關聯實體 由於在乙個sql中,注意兩個實體 查詢結果集 中欄位名不能一樣 一樣的化會在用pagehelper等自動裝配的語句出問題 未明確定義列 還有就是如果id一樣會導致多方只查到乙個 此方法看...