寫在前面:本文僅僅適用於數據分析者,DBA直接無視就好。
1. select子句中儘量避免使用*
2. 儘量避免使用in和not in
in和not in也會導致數據庫進行全表搜索,增加運行時間。比如,我想看看第8、9個人的學號和成績,大多數同學會用這個語句:
select 學號, 成績 from 成績表 where 學號 in (8, 9)
這一類語句,優化方法如下:
select 學號, 成績 from 成績表 where 學號 between 8 and 9
3.使用limit子句限制返回的數據行數
如果前臺只需要顯示15行數據,而你的查詢結果集返回了1萬行,那麼這適合最好使用limt子句來限制查詢返回的數據行數。
4. 儘量避免使用or
or同樣會導致數據庫進項全表搜索。在工作中,如果你只想用or從幾十萬語句中取幾條出來,是非常划不來的,怎麼辦呢?下面的方法可替代or。
從成績表中選出成績是是88分或89分學生的學號:
select 學號 from 成績表 where 成績 = 88 or 成績 = 89
優化後:
select 學號 from 成績表 where 成績 = 88 union select 學號 from 成績表 where 成績 = 89
語句雖然變長了一點,但處理大量數據時,可以省下很多時間,是非常值得的。
5. where子句比較符號左側避免函數
儘量避免在where條件子句中,比較符號的左側出現表達式、函數等操作。因為這會導致數據庫引擎進行全表掃描,從而增加運行時間。
舉個例子,下圖是10名學生的成績表,老師突然發現因為參考答案出錯,給所有人都少加了5分,現在需要查詢:給每人加5分後,成績依然在90分以上的同學的學號。
按照題目的思路直接書寫,“給每人加5分後,成績90分以上”的條件很多人會這樣寫:
where 成績 + 5 > 90 (表達式在比較符號的左側)
優化方法:
where 成績 > 90 – 5(表達式在比較符號的右側)
所以,為了提高效率,where子句中遇到函數或加減乘除的運算,應當將其移到比較符號的右側。