技巧1:使用高效的查詢
原因:
1 使用連接列建立索引,查詢時只需要查詢索引不需要查詢另一個表
2 查到滿足條件的行就會終止查詢,不會像 in一樣掃描全表
- 當用到子查詢時,最好是用 exists而不是 in
- 大多數時候not exists 和 not in查詢結果相同,但exists用于子查詢結果更快

表classes_a

表classes_b
查詢方法1:使用in子句

查詢方法2:使用exists語句(推薦)

技巧2:避免排序
原因:當內存不足,需要在硬盤上排序時,對數據庫性能影響很大,因此要避免排序
-
涉及到排序的語句
- group by子句
- order by子句
- 聚合函數
- distinct
- 集合運算符(union/intersect/except)
- 窗口函數(rank/row_number)
盡量使用union/intersect/except all 而非union/intersect/except,因為后者會根據排序篩選信息
distinct也需要進行排序來去重,因此盡量用exists代替distinct
在極值函數max()/min()函數中使用索引而不是字段,僅掃描索引而非全表
-
能寫在where里的條件不要寫在having子句里
- where可以篩選出一部分行而不用選擇全部數據
- having子句是根據聚合后的結果排序,不能繼承原表的索引結構
技巧3:索引
原因:當使用索引查詢時,不需要掃描全表,只需要查找索引即可,可大大提升效率
當索引出現在條件表達式中,左側應該是原始字段而非原始字段+運算
通常索引字段不存在null,使用null和is null 會使索引無法使用
使用否定形式not in/<>/!=也無法使用索引
建立聯合索引時,使用or的效率要比and更低
聯合索引時,字段的順序與原表中順序一致(如列A and 列B and 列C,順序與原來的順序一致)
使用like謂詞時,只有前方一致即'x%'才能匹配到索引
需要進行類型轉換時顯示類型轉換,如cast(值,as char(2))
技巧4:減少中間表
原因:1 中間表耗費內存資源 2 中間表索引不容易用到,因此需要盡量減少
- 盡量在group by語句后直接使用having篩選,而不是group by結果作為子句+where篩選
- 需要對多個字段使用in時,把他們匯總到一列,如 where 列a in(select.... from) + where 列b in(select.... from)= where a||b in (select a||b ...)
- 先進行連接在進行聚合
- 合理使用視圖,特別避免在視圖中使用聚合函數和聚合運算符