02.27 MySQL charset不同導致無法使用索引的坑


MySQL charset不同導致無法使用索引的坑

今天排查了一個MySQL Charset不同導致無法使用索引的坑。

當然最開始我是不知道的,同事碰到一個性能問題,我也在群裡,因此就撈過界了一把,一起看了一下問題。但是從SQL來說應該是 充分利用了SQL才對,所有該有索引的地方都有。原SQL經脫敏簡化後如下:

<code>SELECT A.* FROM A LEFT JOIN B ON A.xxx=B.xxx AND B.yyy='yyy' INNER JOIN A AS A_1 ON A.xxx=A1.xxx WHERE A.yyy='yyy';/<code>

不過原SQL因為有left join又有inner join,看得我有點暈,於是我直接問原始需求是什麼。原來是想看在A表不在B表,所以我改寫 成這樣:

<code>SELECT A.* FROM A LEFT JOIN B ON A.xxx=B.xxx WHERE B.id IS NULL;/<code>

EXPLAIN一下,發現Explain輸出裡,ref是空,rows卻是接近全表的行數,這說明雖然key和extra上表明用上了索引,但實際上沒有。 實際執行一下也驗證了,確實沒有用上索引,查詢時間非常久。

逐一檢查各表之後,發現該加索引的地方都加了,但是卻沒有用上索引,最後發現是因為字符集不一樣。 SHOW CREATE TABLE xxx 之後發現,一張表默認為 utf8 ,另外一張表默認為 utf8mb4 ,把字符集都改成utf8mb4之後,就可以正常工作了。

參考鏈接:https://stackoverflow.com/questions/18660252/mysql-why-does-left-join-not-use-an-index

來源:https://www.tuicool.com/articles/RNvY7z3


分享到:


相關文章: