解决 SQL 子查询 group by去重 索引失效 的一种思路
生活随笔
收集整理的這篇文章主要介紹了
解决 SQL 子查询 group by去重 索引失效 的一种思路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
子查詢和索引一直是性能優化的常客
查詢簡單的時候還好辦,拿掉子查詢,先join再group by聚合
碰到復雜的查詢,里外查詢維度不統一,還牽扯到別的計算指標,有點難搞
用臨時表是可行的,寫過程,創建臨時表,加索引,刪掉臨時表。
這里提供另一種思路:
如果where子句的過濾條件和子查詢有關,多寫一遍過濾條件就可以避免全表掃描了。
項目中實際遇到的情況
背景:優化某個sql的查詢性能
版本:mysql 5.7
通過查詢計劃可以看到之前的查詢好幾張表都是全掃了一遍,小表還無所謂,最后一行的eo卻是一張大表,更災難的是,相同的邏輯還要 union all 一次,因為有 eo 歷史表
eo數據量150萬,eo歷史表數據量560萬
原先的eo子查詢這么寫的
用shift id關聯,恰好where子句中要過濾 shift date,這里hard code 過濾條件只是測試使用,生產環境為變量
于是eo子查詢可以再關聯一次shift,并加上過濾條件
再次查看執行計劃,發現eo用上了索引
查詢提速明顯
之前查詢耗時
?
優化 eo子查詢后
寫在最后,以上子查詢去重性能優化的方法適用范圍有限,僅提供一種思路供參考。
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的解决 SQL 子查询 group by去重 索引失效 的一种思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server中的LEFT、RIG
- 下一篇: windows xp 提示系统是盗版图标