mysql因為字符集導致left join出現Using join buffer (Block Nested Loop)


1.執行計划

EXPLAIN
SELECT *
FROM 
t2
LEFT JOIN 
t1
ON
t1.bill_num = t2.bill_num

 

 

 這里出現了Using where; Using join buffer (Block Nested Loop) 50w數據查詢了一兩分鍾沒有查詢出來,到底是為什么?

什么是:BNL

BNL(Block Nested-Loop Join)算法

NLJ的原理是內外兩層循環,對外循環中的每條記錄,都要再內循環中做一次檢索。foreacht(){foreacht(){}}

什么是:BKA

BKA(Batched Key Access)算法

通過緩存外層循環讀的行,來降低內層的讀取次數。例如,10行數據讀入buffer中,然后buffer被傳遞到內層循環,內層表讀出的每一行都會跟這個緩存10行依次做對比,這樣就降低了內層表數據的讀取次數

2.增加兩個表的bill_num索引

 

 再次查詢還是不行。索引失效

3.索引為什么失效

  1. 隱式轉換導致索引失效
  2. 隨着表的增長,where條件出來的數據太多,大於15%,使得索引失效(會導致CBO計算走索引花費大於走全表)
  3. 字符集不一致導致索引失效一個utf8一個utf8mb4

4.排查問題發現

兩個表都執行

ALTER TABLE t1 CONVERT TO CHARSET utf8mb4;
ALTER TABLE t2 CONVERT TO CHARSET utf8mb4;

5.再次查看執行計划

EXPLAIN
SELECT *
FROM 
t2
LEFT JOIN 
t1
ON
t1.bill_num = t2.bill_num

查詢一下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM