mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考
【環(huán)境介紹】
云數(shù)據(jù)庫(kù)MySQL 5.7
【背景描述】
業(yè)務(wù)需要:需要對(duì)16370077的表數(shù)據(jù)進(jìn)行更新部分?jǐn)?shù)據(jù)操作
UPDATE P_MOXXXX_REXXXX SET FISAVAILABLE = 1 WHERE FREG_ID IN (SELECT FREG_ID FROM P_MOXXXX_REXXXX_UPDATE_TEMP);
【按照正常流程更新數(shù)據(jù)操作】
使用archery的SQL審核工具進(jìn)行提單操作,操作超過(guò)10分多鐘,最后使用kill會(huì)話暫停操作,
SQL為子查詢更新數(shù)據(jù)操作,業(yè)務(wù)反饋查詢數(shù)據(jù)很快,從更新操作看執(zhí)行很久時(shí)間:
臨時(shí)使用具體的條件值進(jìn)行更新操作執(zhí)行很快:
【分析更新慢問(wèn)題】
從查看SQL看為子查詢更新數(shù)據(jù)操作,查看官方對(duì)子查詢的解釋:
官方解釋數(shù)據(jù)庫(kù)子查詢很明確,更新,刪除數(shù)據(jù)不能使用到半連接或者優(yōu)化子查詢方式優(yōu)化,建議使用連接方式執(zhí)行SQL。
semijoin實(shí)現(xiàn)策略
業(yè)務(wù)反饋查詢數(shù)據(jù)很快,查看對(duì)應(yīng)的執(zhí)行計(jì)劃信息,從執(zhí)行計(jì)劃中就可以馬上看出問(wèn)題,掃描數(shù)據(jù)跟驅(qū)動(dòng)表很大的差別:
查詢的執(zhí)行計(jì)
從執(zhí)行計(jì)劃看,臨時(shí)表作為驅(qū)動(dòng)表,使用索引主鍵,從extra列看,使用了semijoin Duplicate Weedout?策略優(yōu)化子查詢;
update的執(zhí)行計(jì)劃:
從執(zhí)行計(jì)劃看,不能優(yōu)化成semijoin子查詢,并且是一個(gè)相關(guān)子查詢,會(huì)被優(yōu)化器轉(zhuǎn)為?exists相關(guān)子查詢進(jìn)行查詢(select_type:DEPENDENT SUBQUERY),會(huì)根據(jù)外查詢結(jié)果執(zhí)行很多次;
【解決方法】
update/delete 無(wú)法使用 semijoin、materialization 優(yōu)化策略,會(huì)以 exists 方式執(zhí)行,外查詢必須要進(jìn)行全表掃描。
優(yōu)化的方法,改成 join 即可方式更新數(shù)據(jù)操作;
查看執(zhí)行計(jì)劃及更新操作:
從執(zhí)行時(shí)間看執(zhí)行了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/
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 摩尔庄园手游传说鱼在哪刷新 传说鱼什么时
- 下一篇: aws mysql价格_mysql –