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.索引為什么失效
- 隱式轉換導致索引失效
- 隨着表的增長,where條件出來的數據太多,大於15%,使得索引失效(會導致CBO計算走索引花費大於走全表)
- 字符集不一致導致索引失效一個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
查詢一下