mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考
【環境介紹】
云數據庫MySQL 5.7
【背景描述】
業務需要:需要對16370077的表數據進行更新部分數據操作
UPDATE P_MOXXXX_REXXXX SET FISAVAILABLE = 1 WHERE FREG_ID IN (SELECT FREG_ID FROM P_MOXXXX_REXXXX_UPDATE_TEMP);
【按照正常流程更新數據操作】
使用archery的SQL審核工具進行提單操作,操作超過10分多鐘,最后使用kill會話暫停操作,
SQL為子查詢更新數據操作,業務反饋查詢數據很快,從更新操作看執行很久時間:
臨時使用具體的條件值進行更新操作執行很快:
【分析更新慢問題】
從查看SQL看為子查詢更新數據操作,查看官方對子查詢的解釋:
官方解釋數據庫子查詢很明確,更新,刪除數據不能使用到半連接或者優化子查詢方式優化,建議使用連接方式執行SQL。
semijoin實現策略
業務反饋查詢數據很快,查看對應的執行計劃信息,從執行計劃中就可以馬上看出問題,掃描數據跟驅動表很大的差別:
查詢的執行計
從執行計劃看,臨時表作為驅動表,使用索引主鍵,從extra列看,使用了semijoin Duplicate Weedout?策略優化子查詢;
update的執行計劃:
從執行計劃看,不能優化成semijoin子查詢,并且是一個相關子查詢,會被優化器轉為?exists相關子查詢進行查詢(select_type:DEPENDENT SUBQUERY),會根據外查詢結果執行很多次;
【解決方法】
update/delete 無法使用 semijoin、materialization 優化策略,會以 exists 方式執行,外查詢必須要進行全表掃描。
優化的方法,改成 join 即可方式更新數據操作;
查看執行計劃及更新操作:
從執行時間看執行了15.34秒
【參考資料】
https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html
https://opensource.actionsky.com/20200628-mysql/
https://opensource.actionsky.com/20210202-explain/
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园手游传说鱼在哪刷新 传说鱼什么时
- 下一篇: java由大到小输出整数xvz_【视频+