故障分析 | 同一條 SQL 爲什麼在 MariaDB 正常,MySQL 5.7 卻很慢?

做者:王順
愛可生 DBA 團隊成員,在公司負責項目中處理數據庫問題,喜歡學習技術,鑽研技術問題。
本文來源:原創投稿
*愛可生開源社區出品,原創內容未經受權不得隨意使用,轉載請聯繫小編並註明來源。

同一條 SQL 在 MariaDB 上運行正常,爲何在 MySQL 5.7 上運行很慢?

1、問題描述

客戶生產環境數據庫遷移,數據庫從 MariaDB 10.4 遷移到 MySQL 5.7,一條業務 SQL 運行很慢。從客戶瞭解到業務以前在 MariaDB 運行正常,近期業務沒有變動過,遷移到 MySQL 5.7 運行很慢,已經影響業務正常使用。數據庫

2、環境檢查

(因生產環境涉及敏感信息,如下信息爲測試環境信息)學習

  1. MariaDB 的執行計劃

圖片1.png

  1. MySQL 5.7 的執行計劃

圖片2.png

  1. 表結構和列信息

圖片3.png

3、分析過程

  1. 經過執行計劃分析

圖片4.png

從 MySQL 5.7 執行計劃的 warnings 中,能夠清晰的看到 id 字段的字段類型或排序規則轉換,沒法使用索引。測試

  1. 查看圖 3 表結構和列信息對比,兩個表的 id 字段排序規則不一樣存在隱式轉換。以下:sbtest1 表 id 字段 char(32) 排序規則 utf8_binsbtest2 表 id 字段 char(32) 排序規則 utf8_general_ci

4、解決方法:

  1. 將 sbtest1 表 id 字段排序規則 utf8_bin 改爲 utf8_general_ci

圖片5.png

能夠看到排序規則改變後,執行計劃正常。spa

  1. 使用 convert 轉換

圖片6.png

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

5、結論:

MySQL 5.7 檢測到表 sbtest1 的 id 字段和表 sbtest2 的 id 字段的 collation 不一樣,沒有正常走索引,形成查詢很慢。經過改變排序規則或使用 convert 轉換能夠解決。因爲 MariaDB 和 MySQL 的 collation 轉換規則對執行計劃的影響不一樣,在 MariaDB 中,不一樣的 Collation 並無影響到查詢效率。blog

相關文章
相關標籤/搜索