8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:
生活随笔
收集整理的這篇文章主要介紹了
8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
8.2.1.10 Nested-Loop Join Algorithms 嵌套循環 關聯算法:MySQL 執行關聯在表之間使用一個嵌套循環算法或者變種Nested-Loop Join Algorithm 嵌套循環算法:一個簡單的嵌套循環關聯(NLJ)算法讀取記錄從第一個表在一個循環 一次一跳,傳遞每條記錄給一個嵌套循環來處理下一個表在關聯里, 這個產生是被重復很多次,因為剩下的表被關聯假設一個關聯在3個表t1,t2,t3 之間進行 t3是被執行使用下面的關聯條件:Table Join Type
t1 range
t2 ref
t3 ALL如果一個簡單的NLJ 算法被使用,關聯是被處理如下:for each row in t1 matching range {for each row in t2 matching reference key {for each row in t3 {if row satisfies join conditions,send to client}}
}因為 NLJ 算法傳遞記錄一次一條從外部循環到內部循環, 它典型的讀取包處理在內部循環很多次Block 嵌套循環算法:一個Block 嵌套關聯算法使用 記錄buffer 讀取在外部循環來減少內部循環表讀取的次數。比如,10條記錄是讀進到一個buffer,buffer 是被傳遞到下一個內部循環,每條記錄讀到內部循環可以和所有10條記錄比較。 降低內部表讀取的次數MySQL 使用 join buffering 在那些條件下:1.join_buffer_size 系統變量決定了每個join buffer 的大小buffer 的最小值是用于平面index scans,range index scans,和關聯,不使用indexes和因此執行全表掃描。通常, 最好的方式得到快速關聯是增加索引,增加join_buffer_size 的值可以得到快速的全關聯當增加索引是不可能的時候一個join buffer 是分配給每個full join 在2個表之間, 對于一個復雜的關聯在多個表沒有使用索引,多個join buffers是需要的2. join buffering 可以用于當關聯的類型是ALL或者index (換句話說,當沒有可用的索引可以使用時,一個全表掃描被執行,所有整個數據或者index rows 分別的).使用buffer 對于外連接也是可用的3.一個buffer 被分配對于每個連接可以被buffered,因此一個給定的查詢可以產生使用多個join buffers.4.一個join buffer 是不會被分配的對于第一個 nonconst table,即使它是ALL或者Index5. 一個join buffer 是被有限分配來執行關聯和釋放在查詢結束6.只有關聯感興趣的列是被存儲在join buffer,不是這個記錄join 先前描述用于NLJ 算法(沒有buffering), 使用Buffering join是這么完成的:for each row in t1 matching range {for each row in t2 matching reference key {store used columns from t1, t2 in join bufferif buffer is full {for each row in t3 {for each t1, t2 combination in join buffer {if row satisfies join conditions,send to client}}empty buffer}}
}if buffer is not empty {for each row in t3 {for each t1, t2 combination in join buffer {if row satisfies join conditions,send to client}}
}
轉載于:https://www.cnblogs.com/zhaoyangjian724/p/6199135.html
總結
以上是生活随笔為你收集整理的8.2.1.10 Nested-Loop Join Algorithms 嵌套循环 关联算法:的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看文件内容
- 下一篇: Python3实现TCP端口扫描器