SQL查詢性能優化

通過對一些查詢方式和細節的調整,有時能大大提高查詢的效率,本次文章整理自《SQL進階教程》,這本書爲大家提供了很多簡單易行的查詢優化方法,即使你不具備數據庫理論知識,也能夠很容易的掌握到。

筆記綱要:
1、使用高效的查詢方式
2、避免排序
3、善用索引
4、減少中間表

1、使用高效的查詢方式

①在子查詢中,用EXISTS代替IN

exists只要查到一行數據滿足條件就會終止查詢。不用像使用in時掃描全表,大大提高了查詢效率。

②使用表連接代替IN

特別是連接字段設置了索引時,採用表連接是比較有效的。

2、避免排序

會進行排序的代表性運算有:

  • GROUP BY
  • ORDER BY
  • 聚合函數(SUM、COUNT、AVG、MAX、MIN)
  • DISTINCT
  • 集合運算符(UNION、INTERSECT、EXCEPT)
  • 窗口函數(RANK、ROW_NUMBER等)

①用UNION ALL代替UNION

union all 不會進行排序,但由於其不具備去重功能,因此需要添加別的限制條件。

②用EXISTS代替DISTINCT

③在極值函數中使用索引

如MAX(id)中,將id添加索引,在尋找最大值時能夠提高查詢效率。

④當需要運用GROUP BY分組時,能用WHERE別用HAVING

因爲where子句用在group by 之前,可提前對查詢的內容進行篩選,減少了後續group by的工作量;
having需要用在group by之後,且having子句是針對聚合後生成的視圖進行篩選的,很多時候聚合後的視圖都沒有繼承原表的索引結構。

⑤在GROUP BY子句和ORDER BY子句中使用索引

這兩個子句都會進行排序,索引能夠有助於提升排序效率。

3、善用索引

很多時候,由於對索引使用時的不當,導致不能發揮索引對於查詢的優化能力。

①不要在索引字段上進行運算

select * from student where age-10>10;

在這種情況下,並沒有真正的用到age列的索引,正確的方式是:

select * from student where age>20;

②不要使用IS NULL

通常,索引字段是不存在NULL的,所以指定IS NULL會使得索引無法使用。

③慎用否定形式

下面這幾種否定形式會對全表進行掃描,使索引失效:

  • <>
  • !=
  • NOT IN

④慎用OR

若在col_1和col_2分別建立了不同的索引,或者建立了(col_1,col_2)這樣的聯合索引時,如果使用OR連接條件,要麼用不到索引,要麼用到了但是比AND效率差很多。

⑤使用聯合索引時,保證列的順序正確

如建立了(col_1,col_2)的聯合索引,索引中的第一列必須寫在條件的開頭

select * from student where col_1=10 and col_2=20;

而不能寫爲

select * from student where col_2=20 and col_1=10;

⑥使用LIKE時,只能進行前方一致的匹配

select name from student where name like 'a%';

4、減少中間表

頻繁使用中間表會帶來兩個問題:

  • 一是展開數據需要耗費內存資源;
  • 二是原始表中的索引不容易使用到(特別是聚合時)

①靈活使用HAVING子句

對聚合結果指定篩選條件是不需要專門生成中間表,使用HAVING子句就可以。

②需要對多個字段使用IN時,將它們彙總到一處

select * from student s1
where  id || state || city
    in (select id || state || city from student s2);

③先進行連接在進行聚合

④合理的使用視圖

當視圖中包含以下運算時,SQL會非常低效:

  • 聚合函數(SUM、COUNT、AVG、MAX、MIN)
  • 集合運算符(UNION、INTERSECT、EXCEPT)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章