您好,登錄后才能下訂單哦!
最近,MySQL維護中,遇到一個問題,通條SQL語句,在mysql 5.6的測試環(huán)境中執(zhí)行速度不到1秒,但是在
mysql 5.7生產(chǎn)環(huán)境中執(zhí)行卻要近5分鐘,mysql 5.7中同樣的數(shù)據(jù)庫同樣的數(shù)據(jù)量,更新完表的統(tǒng)計信息后執(zhí)行
速度還是要2分鐘。本次問題的處理與sql語句本身沒有關系,只跟mysql數(shù)據(jù)庫自身的優(yōu)化器參數(shù)相關,下面是
問題的分析排查過程,問題分析中的sql語句不需要顯示,可以明確sql是多表join連接并且業(yè)務不允許更改。
1、首先,查看測試環(huán)境和生產(chǎn)環(huán)境中,mysql的sql語句的執(zhí)行計劃
--測試環(huán)境,執(zhí)行計劃只需顯示局部能說明問題即可
--生產(chǎn)環(huán)境,執(zhí)行計劃只需顯示局部能說明問題即可
2、從測試與生產(chǎn)環(huán)境sql語句的對比可以明顯發(fā)現(xiàn),sql的執(zhí)行計劃不一致,后續(xù)排查中發(fā)現(xiàn)
a、測試環(huán)境中sql涉及的表和索引的統(tǒng)計信息都是當天最新的,而生產(chǎn)環(huán)境中的相關表和索引的統(tǒng)計信息比較陳舊
b、測試環(huán)境 mysql大版本為5.6,生產(chǎn)環(huán)境mysql大版本為5.7
3、問題處理
a、由于sql執(zhí)行計劃不一致,且生產(chǎn)環(huán)境統(tǒng)計信息比較舊,重新收集生產(chǎn)環(huán)境表的統(tǒng)計信息,收集后sql的執(zhí)行速度沒有
提高,相比測試依然很慢。
b、關注測試環(huán)境執(zhí)行計劃derived和<auto_key>,該特性與mysql 的參數(shù)derived_merge相關,查看該參數(shù)的設置情況
--測試環(huán)境
MySQL [(none)]> show global variables like '%switch%';
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| optimizer_switch | index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,....... |
+------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MySQL [(none)]>
--生產(chǎn)環(huán)境,為了方便說明問題,省略了多余的參數(shù)顯示
mysql> show variables like '%switch%';
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| optimizer_switch | ......, derived_merge=on |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
c、根據(jù)官方說明參數(shù)derived_merge是在mysql5.7版本中引入的,作用就是對join (select)表連接合并,本次問題sql有
大量的join (select),導致sql執(zhí)行結果集合并,sql執(zhí)行速度及其緩慢。
d、通過session級別臨時取消該參數(shù),觀察sql執(zhí)行計劃,發(fā)現(xiàn)sql執(zhí)行計劃正常,且sql執(zhí)行速度不到1秒與測試環(huán)境相近
--取消優(yōu)化器derived_merge參數(shù)
mysql> set optimizer_switch="derived_merge=off";
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 8980
Current database: mysql
Query OK, 0 rows affected (0.02 sec)
mysql>
--觀察問題sql執(zhí)行計劃,此時生產(chǎn)環(huán)境執(zhí)行計劃與測試環(huán)境相同
--問題sql執(zhí)行速度由原先的近5分鐘到現(xiàn)在的1秒左右
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。