解决 SQL 子查询 group by去重 索引失效 的一种思路
子查詢和索引一直是性能優(yōu)化的常客
查詢簡(jiǎn)單的時(shí)候還好辦,拿掉子查詢,先join再group by聚合
碰到復(fù)雜的查詢,里外查詢維度不統(tǒng)一,還牽扯到別的計(jì)算指標(biāo),有點(diǎn)難搞
用臨時(shí)表是可行的,寫過程,創(chuàng)建臨時(shí)表,加索引,刪掉臨時(shí)表。
這里提供另一種思路:
如果where子句的過濾條件和子查詢有關(guān),多寫一遍過濾條件就可以避免全表掃描了。
項(xiàng)目中實(shí)際遇到的情況
背景:優(yōu)化某個(gè)sql的查詢性能
版本:mysql 5.7
通過查詢計(jì)劃可以看到之前的查詢好幾張表都是全掃了一遍,小表還無(wú)所謂,最后一行的eo卻是一張大表,更災(zāi)難的是,相同的邏輯還要 union all 一次,因?yàn)橛?eo 歷史表
eo數(shù)據(jù)量150萬(wàn),eo歷史表數(shù)據(jù)量560萬(wàn)
原先的eo子查詢這么寫的
用shift id關(guān)聯(lián),恰好where子句中要過濾 shift date,這里hard code 過濾條件只是測(cè)試使用,生產(chǎn)環(huán)境為變量
于是eo子查詢可以再關(guān)聯(lián)一次shift,并加上過濾條件
再次查看執(zhí)行計(jì)劃,發(fā)現(xiàn)eo用上了索引
查詢提速明顯
之前查詢耗時(shí)
?
優(yōu)化 eo子查詢后
寫在最后,以上子查詢?nèi)ブ匦阅軆?yōu)化的方法適用范圍有限,僅提供一種思路供參考。
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的解决 SQL 子查询 group by去重 索引失效 的一种思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server中的LEFT、RIG
- 下一篇: SQL——子查询