問題背景
在工作時,有一個聯表查詢的操作,兩個表,每個表大概20萬條資料,查詢語句類似下面的SQL語句。
select a.name1, a.name2, b.name1, b.name2
from table1 a, table2 b on a.name3 = b.name3 and a.name4 = b.name4;
兩個表的name3和name4字段都建立了索引,但是查詢速度依舊很慢。
分析問題
使用explain分析該語句,發現表b并沒有使用索引,而是采用了全部周遊的方式。
表b上的name3,name4索引區分度很高,MySQL的優化器應該不會選擇不使用這兩個索引,那為什麼聯表查詢的時候沒走索引呢?
根本原因
最後一通排查,發現是兩個表的編碼格式不一樣,一個是utf8,一個是utf8md4。utf8md4是utf8的超集,但是兩者的索引并不相容,需要将utf8轉換成utf8md4。轉換語句如下
alter table a convert to character set utf8md4
這樣就可以使用索引了,查詢速度瞬間快了好多。
其他
MySQL在5.5.3之後增加了utf8md4這個編碼來相容四個位元組的unicode,可以用來存儲一些emoji表情等字元。
參考資料
https://www.huaweicloud.com/articles/5fece55be68259e89d87989ca69ee9ce.html