国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL 優化器參數derived_merge致使多表關聯SQL性能及其低下

2024-07-24 12:31:27
字體:
來源:轉載
供稿:網友
       最近,MySQL維護中,遇到一個問題,通條SQL語句,在mysql 5.6的測試環境中執行速度不到1秒,但是在
 
       mysql 5.7生產環境中執行卻要近5分鐘,mysql 5.7中同樣的數據庫同樣的數據量,更新完表的統計信息后執行
 
       速度還是要2分鐘。本次問題的處理與sql語句本身沒有關系,只跟mysql數據庫自身的優化器參數相關,下面是
 
       問題的分析排查過程,問題分析中的sql語句不需要顯示,可以明確sql是多表join連接并且業務不允許更改。
 
    1、首先,查看測試環境和生產環境中,mysql的sql語句的執行計劃
  
--生產環境,執行計劃只需顯示局部能說明問題即可
 
    2、從測試與生產環境sql語句的對比可以明顯發現,sql的執行計劃不一致,后續排查中發現
a、測試環境中sql涉及的表和索引的統計信息都是當天最新的,而生產環境中的相關表和索引的統計信息比較陳舊
b、測試環境 mysql大版本為5.6,生產環境mysql大版本為5.7
 
    3、問題處理
a、由于sql執行計劃不一致,且生產環境統計信息比較舊,重新收集生產環境表的統計信息,收集后sql的執行速度沒有
 
提高,相比測試依然很慢。
 
b、關注測試環境執行計劃derived和<auto_key>,該特性與mysql 的參數derived_merge相關,查看該參數的設置情況
 
--測試環境
 
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)]>
 
--生產環境,為了方便說明問題,省略了多余的參數顯示
 
mysql> show  variables like '%switch%';
 
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
| Variable_name    | Value                                                                                                                                                                                                                                                                                                                                                                                                             |
 
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
| optimizer_switch | ......, derived_merge=on |
 
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
1 row in set (0.00 sec)
 
mysql>
 
c、根據官方說明參數derived_merge是在mysql5.7版本中引入的,作用就是對join (select)表連接合并,本次問題sql有
 
大量的join (select),導致sql執行結果集合并,sql執行速度及其緩慢。
 
d、通過session級別臨時取消該參數,觀察sql執行計劃,發現sql執行計劃正常,且sql執行速度不到1秒與測試環境相近
 
--取消優化器derived_merge參數
 
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執行計劃,此時生產環境執行計劃與測試環境相同
  
--問題sql執行速度由原先的近5分鐘到現在的1秒左右

(編輯:武林網)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇雄县| 邢台县| 鸡泽县| 循化| 旌德县| 蓝山县| 刚察县| 山东省| 敦煌市| 左云县| 西乌珠穆沁旗| 海城市| 若羌县| 崇左市| 河北省| 麻栗坡县| 吉安县| 左云县| 平远县| 泰州市| 霍山县| 双流县| 上虞市| 桂东县| 桃江县| 安陆市| 泸州市| 陆河县| 修武县| 大理市| 五指山市| 新干县| 威宁| 昭觉县| 平阳县| 乡城县| 扶风县| 宽城| 沧州市| 讷河市| 金坛市|