mysql in()后子查詢優化


線上數據發現一條數據大量等待的現象,通過explain發現這個sql寫法存在問題,這里簡單記錄一下.

業務場景是這樣:

存在購物車和費用兩張表,購物車數據是購買商品時生成,用於記錄購買商品數據,同時購買的商品也會生成費用表,用於統計商品總的支出情況(相當於訂單),購物車和費用的關系是多對一,通過gg_gwc.fyxh=gg_fei.id關聯.這里需要更新滿足條件的購物車關聯的fei的數據.

  • 原始查詢方式:

因為是測試環境,實際的執行時間並不長,但是gg_fei表發現雖然使用了id索引,但是查詢條件卻是全表查詢,因為in條件中使用子查詢會造成索引失效;

  • 優化嘗試方式
  • 方式1:

這種方式實際的結果顯示是失敗的,因為它沒有從根本上改變in(子查詢)這種方式,它的想法是減少子查詢的數據,來加速sql訪問,單純從這條sql來看,實際確實也有點作用,他將子查詢8條限制為2條;但是第一條sql因為條件已經很精確,它實際的查詢只有一條;

  • 方式2:

這種方式是通過內連接查詢實現,實際查詢結果顯示有效,它將gg_fei表查詢數量降到了1條,gg_gwc也使用了索引,但是因為關聯查詢是一個子查詢他會生成一個派生表(簡化的臨時表),這個派生表也會增加一次查詢,雖然有效但是從表面上不是最優解.

  • 方式3:

查資料有人說:from a,b where a.id=b.id 是內連接的簡化方式,這種方式它成功的去除了子查詢,inner join也可以寫成這種方式,目前來看是這個幾個方式里的最優解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM