作者:王順
愛可生 DBA 團隊成員,在公司負責項目中處理數據庫問題,喜歡學習技術,鉆研技術問題。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
同一條 SQL 在 MariaDB 上運行正常,為什么在 MySQL 5.7 上運行很慢?
一、問題描述
客戶生產環境數據庫遷移,數據庫從 MariaDB 10.4 遷移到 MySQL 5.7,一條業務 SQL 運行很慢。
從客戶了解到業務之前在 MariaDB 運行正常,近期業務沒有變更過,遷移到 MySQL 5.7 運行很慢,已經影響業務正常使用。
二、環境檢查
(因生產環境涉及敏感信息,以下信息為測試環境信息)
1. MariaDB 的執行計劃
2. MySQL 5.7 的執行計劃
3. 表結構和列信息
三、分析過程
1. 通過執行計劃分析
從 MySQL 5.7 執行計劃的 warnings 中,可以清晰的看到 id 字段的字段類型或排序規則轉換,無法使用索引。
2. 查看圖 3 表結構和列信息對比,兩個表的 id 字段排序規則不同存在隱式轉換。
如下:
sbtest1 表 id 字段 char(32) 排序規則 utf8_bin
sbtest2 表 id 字段 char(32) 排序規則 utf8_general_ci
四、解決方法:
1. 將 sbtest1 表 id 字段排序規則 utf8_bin 改成 utf8_general_ci
可以看到排序規則改變后,執行計劃正常。
2. 使用 convert 轉換
使用 convert 對 sbtest1 表 id 字段進行轉換,執行計劃正常。
五、結論:
MySQL 5.7 檢測到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不同,沒有正常走索引,造成查詢很慢。通過改變排序規則或使用 convert 轉換可以解決。由于 MariaDB 和 MySQL 的 collation 轉換規則對執行計劃的影響不同,在 MariaDB 中,不同的 Collation 并沒有影響到查詢效率。