同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

愛可生 DBA 團隊成員,在公司負責項目中處理數據庫問題,喜歡學習技術,鑽研技術問題。


同一條 SQL 在 MariaDB 上運行正常,為什麼在 MySQL 5.7 上運行很慢?


一、問題描述

客戶生產環境數據庫遷移,數據庫從 MariaDB 10.4 遷移到 MySQL 5.7,一條業務 SQL 運行很慢。

從客戶瞭解到業務之前在 MariaDB 運行正常,近期業務沒有變更過,遷移到 MySQL 5.7 運行很慢,已經影響業務正常使用。


二、環境檢查

(因生產環境涉及敏感信息,以下信息為測試環境信息)

1. MariaDB 的執行計劃

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

2. MySQL 5.7 的執行計劃

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

3. 表結構和列信息

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生


三、分析過程

1. 通過執行計劃分析

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

從 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

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

可以看到排序規則改變後,執行計劃正常。

2. 使用 convert 轉換

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生

使用 convert 對 sbtest1 表 id 字段進行轉換,執行計劃正常。


五、結論:

MySQL 5.7 檢測到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不同,沒有正常走索引,造成查詢很慢。通過改變排序規則或使用 convert 轉換可以解決。由於 MariaDB 和 MySQL 的 collation 轉換規則對執行計劃的影響不同,在 MariaDB 中,不同的 Collation 並沒有影響到查詢效率。


關於愛可生

愛可生成立於2003年,依託於融合、開放、創新的數據處理技術和服務能力,為大型行業用戶的特定場景提供深度挖掘數據價值的解決方案。

公司持續積累的核心關鍵技術,覆蓋到分佈式數據庫集群、雲數據平臺、數據庫大體量運管平臺、海量數據集成於存儲、清洗與治理、人工智能分析挖掘、可視化展現、安全與隱私保護等多個領域。

公司已與多個行業內的專業公司建立了長期夥伴關係,不斷促進新技術與行業知識相結合,為用戶尋求新的數據驅動的價值增長點。公司已在金融、能源電力、廣電、政府等行業取得了眾多大型用戶典型成功案例,獲得了市場的認可和業務的持續增長。

同一條SQL為何在MariaDB正常,MySQL5.7卻很慢-愛可生


分享到:


相關文章: