線上數據發現一條數據大量等待的現象,通過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也可以寫成這種方式,目前來看是這個幾個方式里的最優解
