最近在優化一個功能,原寫法是視圖中套用視圖,視圖中又有視圖,且查詢了多張表用不同的數據源,用了union也用了union all,還有left join 和 inner join 及內連接的使用。
現象: 打開列表頁面DB的使用率就高達30%
優化點:
1、在業務允許的情況下用union all 代替union
union all 和 union 都是將兩個結果集合並,但是效率有所不同:
a.對重復結果的處理:union 會篩選去掉結果集中重復數據,而union all 允許有重復數據;
b.對排序的處理:union會按照字段進行排序,而union all 只是匯集結果后返回。
所以union all 的效率會高於union,在業務允許的情況使用union all。
2、left join 和 inner join的優化
a.left join是左外連接,左邊主表的內容全部顯示出來,關聯表滿足條件就才顯示;
b.inner join沒有主附表的區分,兩個表滿足關聯條件的都顯示出來(inner join簡寫就是join);
優化點:left join是左外連接用在主表數據較少,從表數據量較大的時候;如果業務邏輯要求主表數據量比較大可以考慮inner join ,因為inner join返回結果的時候會自動選取數據量小的為基礎表(待驗證)。
3、全連接效率最大,占用資源最多,盡量優化