pl/sql里的exists和in的差别
項目中有個需要需要如下pl/sql(數(shù)據(jù)庫是MariaDB)
SELECT COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND EXISTS(SELECT 1 FROM cmp_ent_service_config WHERE entId=a.id AND serviceType IN(2,3,4) AND STATUS=0) ;執(zhí)行時發(fā)現(xiàn)耗時近50秒,這是測試環(huán)境啊,
表cmp_ent_main,pk是id,有74836條記錄;表cmp_ent_service_config,pk是entId和serviceType,有2254條記錄,并不多。
explain看一下執(zhí)行計劃:
說實話,mysql不熟,也并沒看出什么門道。
經(jīng)過排查原因,最后發(fā)現(xiàn)原因是cmp_ent_service_config表的entId是varchar, entId是企業(yè)Id,這個系統(tǒng)里約定的企業(yè)Id是bigint。看來做這個模塊的設(shè)計者忽略了這一點就設(shè)置成varchar了。
改成bigint,果然,毫秒級就查出結(jié)果了。類型一致多么的重要!
?
我找到這個模塊的開發(fā)擔(dān)當(dāng),他習(xí)慣用in,于是改成in,并恢復(fù)entId的類型為varchar,發(fā)現(xiàn)也是毫秒級出結(jié)果。
EXPLAINSELECT COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND EXISTS(SELECT 1 FROM cmp_ent_service_config WHERE entId=a.id AND serviceType IN(2,3,4) AND STATUS=0) ;EXPLAINSELECT 0 allcount, COUNT(1) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21'AND a.id IN(SELECT entId FROM cmp_ent_service_config WHERE serviceType IN(2,3,4) AND STATUS=0)細(xì)看兩者的查詢計劃,發(fā)現(xiàn)主要的區(qū)別是cmp_ent_main的記錄數(shù),一個是70303,一個是1
當(dāng)把entId的類型改為bigint后, 兩者的執(zhí)行計劃是:
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/buguge/p/5854325.html
總結(jié)
以上是生活随笔為你收集整理的pl/sql里的exists和in的差别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3_STL算法
- 下一篇: 如果添加1条数据会等待10秒,你愿意等吗