我們公司的數據量非常大,需要的不僅僅是提取數據,要了解SQL方案優化的。一般在寫SQL時需要注意哪些問題,可以提高查詢的效率?
【解題思路】
數據量大的情況下,不同的SQL語句,消耗的時間相差很大。按下面方法可以提高查詢的效果。
1. select子句中盡量避免使用*
select子句中,*是選擇全部數據的意思。比如語句:“select * from 成績表”,意思是選擇成績表中所有列的數據。
在我們平時的練習中,往往沒有那么多數據,所以很多同學會圖方便使用*。而在處理公司事務時,動輒十萬、百萬,甚至上千萬的數據,這個時候再用*,那么接下來的幾分鐘就只能看著電腦屏幕發呆了。
所以,在我們平常的練習中,就要養成好的習慣,最后需要哪些列的數據,就提取哪些列的數據。盡量少用*來獲取數據。
另外,如果select * 用于多表聯結,會造成更大的成本開銷。
2. where子句比較符號左側避免函數
盡量避免在where條件子句中,比較符號的左側出現表達式、函數等操作。因為這會導致數據庫引擎進行全表掃描,從而增加運行時間。
舉個例子,下圖是10名學生的成績表,老師突然發現因為參考答案出錯,給所有人都少加了5分,現在需要查詢:給每人加5分后,成績依然在90分以上的同學的學號。
按照題目的思路直接書寫,“給每人加5分后,成績90分以上”的條件很多人會這樣寫:
where 成績 + 5 > 90 (表達式在比較符號的左側)
優化方法:
where 成績 > 90 – 5(表達式在比較符號的右側)
所以,為了提高效率,where子句中遇到函數或加減乘除的運算,應當將其移到比較符號的右側。
3. 盡量避免使用in和not in
in和not in也會導致數據庫進行全表搜索,增加運行時間。
比如,我想看看第8、9個人的學號和成績,大多數同學會用這個語句:
select 學號, 成績 from 成績表 where 學號 in (8, 9)
這一類語句,優化方法如下:
select 學號, 成績 from 成績表 where 學號 between 8 and 9
4. 盡量避免使用or
or同樣會導致數據庫進項全表搜索。在工作中,如果你只想用or從幾十萬語句中取幾條出來,是非常劃不來的,怎么辦呢?下面的方法可替代or。
從成績表中選出成績是是88分或89分學生的學號:
select 學號 from 成績表 where 成績 = 88 or 成績 = 89
優化后:
select 學號 from 成績表 where 成績 = 88
union
select 學號 from 成績表 where 成績 = 89
語句雖然變長了一點,但處理大量數據時,可以省下很多時間,是非常值得的。
5.使用limit子句限制返回的數據行數
如果前臺只需要顯示15行數據,而你的查詢結果集返回了1萬行,那么這適合最好使用limt子句來限制查詢返回的數據行數。
【本題考點】
在面試中,當面試官提出這一類問題,按照上述的方法進行回答都是沒有問題的,但不僅在面試中,平時練習就養成習慣是最好的。
大多數同學都會覺得“麻煩”、“不做也沒有什么影響”,但是習慣總是慢慢養成的。
擁有好習慣,未來在工作中,面對不同的數據量,就可以游刃有余地選擇不同的方法來降低完成時間,從而提升工作效率。