通過對一些查詢方式和細節的調整,有時能大大提高查詢的效率,本次文章整理自《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)