join 語句的兩種實現演算法分別是 index nested-loop join和 block nested-loop join,針對於這兩個演算法都還有相應的優化方法。
在這之前,我們先介紹下mrr優化。
34.1multi-range read 優化
multi-range read優化 (mrr) :優化的目的是盡量順序讀盤,mysql認為磁碟順序讀比磁碟隨機讀的效能更加好。
這裡我們需要明白**「回表」**的概念,mrr優化主要針對於這個過程。
例如下面這個sql語句,假設需要進行回表的情況:
select
*from t where a between
10and
60
正常的回表過程:這個我們的問題是:每個回表的資料時一行一行進行地,並且可能逐行拿到的id是無序的,這樣就會操作磁碟的隨機讀,mrr優化就是將id進行排序後,再進行回表。
mrr優化後的流程
read_rnd_buffer的大小由引數**「read_rnd_buffer_size」**控制,如果一次性裝不下,就會分多次裝入,同時也會排序操作多次。
如果我們需要使用mrr(mysql 預設關閉),我們需要進行如下設定:
從explain語句中的extra欄位中可以看出,使用mrr優化。
mrr優化在需要進行回表的基礎上,需要查詢足夠多的值,將隨機訪問變化順序訪問的一種操作。
34.2 batched key access
mysql於5.6版本引入 batched key access 演算法,bka演算法是對nlj演算法的一種優化。
nlj演算法的邏輯:驅動表進行全表掃瞄,一行一行地取出,到被驅動表中走索引來獲取相應的結果集。
這個nlj演算法是一行一行來的,無法應用mrr優化,所以,我們給它用上join_buffer作為臨時表,便可以解決。
bka演算法也就是用上了join_buffer+mrr優化的nlj演算法。
流程如下圖所示:
啟用bka演算法的設定如下,前兩個的引數設定為開啟mrr優化
set optimizer_switch=
'mrr=on,mrr_cost_based=off,batched_key_access=on'
;
34.3 bnl演算法的優化
先來手下bnl演算法帶來的影響:
1.bnl轉bka
在被驅動表上新增索引,但是如果這個sql語句為低頻率語句,就有點不知當了。
2.使用臨時表
使用臨時表的大致思路為:
3.hash join
mysql 8.0引入演算法的實現,大致原理如下:
資料庫 Join語句優化
關聯查詢的演算法 nested loop join 演算法 block nested loop join 演算法 nested loop join 演算法 乙個簡單的 nested loop join nlj 演算法一次一行迴圈地從第一張表 稱為驅動表 中讀取行,在這行資料中取到關聯字段,根據關聯欄...
mysql 語句優化例項 MySQL 語句優化例項
優化 limit 分頁 執行耗時 1.379s select from vio basic domain info limit 1000000,10 處理分頁慢查詢的方式一般有以下幾種 思路一 構造覆蓋索引 思路二 優化 offset 無法用上覆蓋索引,那麼重點是想辦法快速過濾掉前 100w 條資料...
mysql語句優化原則 MySQL語句優化的原則
1 使用索引來更快地遍歷表。預設情況下建立的索引是非群集索引,但有時它並不是最佳的。在非群集索引下,資料在物理上隨機存放在資料頁上。合理的索引設計要建立在對各種查詢的分析和 上。一般來說 a.有大量重複值 且經常有範圍查詢 和order by group by發生的列,可考慮建立群集索引 b.經常同...