線上數據發現一條數據大量等待的現象,經過explain發現這個sql寫法存在問題,這裏簡單記錄一下.sql
業務場景是這樣:測試
存在購物車和費用兩張表,購物車數據是購買商品時生成,用於記錄購買商品數據,同時購買的商品也會生成費用表,用於統計商品總的支出狀況(至關於訂單),購物車和費用的關係是多對一,經過gg_gwc.fyxh=gg_fei.id關聯.這裏須要更新知足條件的購物車關聯的fei的數據.優化
由於是測試環境,實際的執行時間並不長,可是gg_fei表發現雖然使用了id索引,可是查詢條件倒是全表查詢,由於in條件中使用子查詢會形成索引失效;blog
這種方式實際的結果顯示是失敗的,由於它沒有從根本上改變in(子查詢)這種方式,它的想法是減小子查詢的數據,來加速sql訪問,單純從這條sql來看,實際確實也有點做用,他將子查詢8條限制爲2條;可是第一條sql由於條件已經很精確,它實際的查詢只有一條;索引
這種方式是經過內鏈接查詢實現,實際查詢結果顯示有效,它將gg_fei表查詢數量降到了1條,gg_gwc也使用了索引,可是由於關聯查詢是一個子查詢他會生成一個派生表(簡化的臨時表),這個派生表也會增長一次查詢,雖然有效可是從表面上不是最優解.im
查資料有人說:from a,b where a.id=b.id 是內鏈接的簡化方式,這種方式它成功的去除了子查詢,inner join也能夠寫成這種方式,目前來看是這個幾個方式裏的最優解統計