最近,MySQL維護(hù)中,遇到一個(gè)問題,通條SQL語(yǔ)句,在mysql 5.6的測(cè)試環(huán)境中執(zhí)行速度不到1秒,但是在
創(chuàng)新互聯(lián)長(zhǎng)期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為祿豐企業(yè)提供專業(yè)的成都網(wǎng)站制作、網(wǎng)站建設(shè),祿豐網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
mysql 5.7生產(chǎn)環(huán)境中執(zhí)行卻要近5分鐘,mysql 5.7中同樣的數(shù)據(jù)庫(kù)同樣的數(shù)據(jù)量,更新完表的統(tǒng)計(jì)信息后執(zhí)行
速度還是要2分鐘。本次問題的處理與sql語(yǔ)句本身沒有關(guān)系,只跟mysql數(shù)據(jù)庫(kù)自身的優(yōu)化器參數(shù)相關(guān),下面是
問題的分析排查過(guò)程,問題分析中的sql語(yǔ)句不需要顯示,可以明確sql是多表join連接并且業(yè)務(wù)不允許更改。
1、首先,查看測(cè)試環(huán)境和生產(chǎn)環(huán)境中,mysql的sql語(yǔ)句的執(zhí)行計(jì)劃
--測(cè)試環(huán)境,執(zhí)行計(jì)劃只需顯示局部能說(shuō)明問題即可
--生產(chǎn)環(huán)境,執(zhí)行計(jì)劃只需顯示局部能說(shuō)明問題即可
2、從測(cè)試與生產(chǎn)環(huán)境sql語(yǔ)句的對(duì)比可以明顯發(fā)現(xiàn),sql的執(zhí)行計(jì)劃不一致,后續(xù)排查中發(fā)現(xiàn)
a、測(cè)試環(huán)境中sql涉及的表和索引的統(tǒng)計(jì)信息都是當(dāng)天最新的,而生產(chǎn)環(huán)境中的相關(guān)表和索引的統(tǒng)計(jì)信息比較陳舊
b、測(cè)試環(huán)境 mysql大版本為5.6,生產(chǎn)環(huán)境mysql大版本為5.7
3、問題處理
a、由于sql執(zhí)行計(jì)劃不一致,且生產(chǎn)環(huán)境統(tǒng)計(jì)信息比較舊,重新收集生產(chǎn)環(huán)境表的統(tǒng)計(jì)信息,收集后sql的執(zhí)行速度沒有
提高,相比測(cè)試依然很慢。
b、關(guān)注測(cè)試環(huán)境執(zhí)行計(jì)劃derived和<auto_key>,該特性與mysql 的參數(shù)derived_merge相關(guān),查看該參數(shù)的設(shè)置情況
--測(cè)試環(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)境,為了方便說(shuō)明問題,省略了多余的參數(shù)顯示
mysql> show variables like '%switch%';
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| optimizer_switch | ......, derived_merge=on |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
c、根據(jù)官方說(shuō)明參數(shù)derived_merge是在mysql5.7版本中引入的,作用就是對(duì)join (select)表連接合并,本次問題sql有
大量的join (select),導(dǎo)致sql執(zhí)行結(jié)果集合并,sql執(zhí)行速度及其緩慢。
d、通過(guò)session級(jí)別臨時(shí)取消該參數(shù),觀察sql執(zhí)行計(jì)劃,發(fā)現(xiàn)sql執(zhí)行計(jì)劃正常,且sql執(zhí)行速度不到1秒與測(cè)試環(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í)行計(jì)劃,此時(shí)生產(chǎn)環(huán)境執(zhí)行計(jì)劃與測(cè)試環(huán)境相同
--問題sql執(zhí)行速度由原先的近5分鐘到現(xiàn)在的1秒左右
分享名稱:MySQL優(yōu)化器參數(shù)derived_merge導(dǎo)致多表關(guān)聯(lián)SQL性能及其低下
URL標(biāo)題:http://muchs.cn/article2/pdpeic.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、云服務(wù)器、網(wǎng)站導(dǎo)航、品牌網(wǎng)站制作、軟件開發(fā)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)