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






