面試:請談談你日常如何做SQL優化

首先我們要搞清楚爲什麼要進行SQL優化

       開發項目上線初期或者開發的項目級別小,由於業務數據量相對較少,一些SQL的執行效率對程序運行效率的影響不明顯,而隨着時間的積累,項目的成熟,業務數據量與日俱增,這時SQL的執行效率對程序的運行效率的影響逐漸增大,此時就必須進行SQL優化來提升系統的運行性能。

如何進行SQL優化

1.優化表結構

1.1儘量使用數字型字段

  • 若只含數值信息的字段儘量不要設計爲字符型,這會降低查詢和連接的性能,並會增加存儲開銷。 
  •  這是因爲引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對於數字型而言只需要比較一次就夠了。  

1.2儘可能的使用 varchar 代替 char

  • 首先變長字段存儲空間小,可以節省存儲空間,    
  • 對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

1.3對作爲查詢條件和order by的字段簡歷索引

   建立索引後可以有效的避免全表掃描。

1.4當索引列大量重複數據時,可以把索引刪除掉

   並不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重複時,SQL查詢可能不會去利  用索引,如一表中有字段sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。  

1.5一個表中索引最多不要超過6個。 

2.通過優化查詢

2.1避免在 where 子句中對字段進行 null 值判斷

 where 子句中對字段進行 null 值判斷,這樣導致引擎放棄對該字段的索引查詢,而變爲全表掃描。

 如何解決?我們可以給需要判斷的字段設置默認值。

如:select id from t where num is null    
可以在num上設置默認值0,確保表中num列沒有null值,然後這樣查詢:    
select id from t where num=0    

2.2應儘量避免在 where 子句中使用!=或<>操作符

使用該符號後,也會導致字段索引無效,進行全表掃描。

2.3應儘量避免在 where 子句中使用 or 來連接條件

使用or來連接條件,也會導致放棄使用索引,而進行全表掃描。

解決方案:

select id from t where num=10 or num=20    
可以這樣查詢:    
select id from t where num=10    
union all    
select id from t where num=20    

2.4應儘量避免在 where中使用 in 和 not in

 使用in 和 not in,也會導致放棄使用索引,而進行全表掃描。

 建議: 對於連續的數值,能用 between 不用 in 了    

 select id from t where num in(1,2,3)    改爲下面的查詢
 select id from t where num between 1 and 3   

2.5應儘量避免使用like關鍵字作爲查詢條件

在like條件中使用的前後都模糊查詢,會導致全表查詢。如下面的例子

select id from t where name like '%abc%'     

2.6應儘量避免在where子句中對字段進行函數或表達式操作

對字段進行函數或表達式操作,會導致字段的索引失效。進行全表掃描。

查詢條件name以abc開頭的id 

select id from t where substring(name,1,3)='abc'   
應改爲:    
select id from t where name like 'abc%'    

查詢num一半爲100的id。

select id from t where num/2=100    
應改爲:    
select id from t where num=100*2    

2.7使用索引字段作爲條件時,複合索引的使用

使用符合索引字段作爲條件時,必須使用到該索引中的第一個字段作爲條件才能保證系統使用該索引,否則該索引將不會被使用,並且應儘可能的使用符合索引字段作爲條件且順序與索引順序相一致。    

2.8很多時候用 exists 代替 in 是一個好的選擇

select num from a where num in(select num from b)    
用下面的語句替換:    
select num from a where exists(select 1 from b where num=a.num)    

2.9任何查詢也不要出現select *

用具體的字段列表代替“*”,不要返回用不到的任何字段。

2.10儘量避免大事務操作,提高系統併發能力。

2.11.儘量避免向客戶端返回大數據量。

總結:

其實在我們日常開發中初級階段,很少會進行SQL優化,而且由於數據量太少,我們感覺不到優化的效果。但是當數據量很大,且項目日增長數據很大時。必須要進行SQL優化。大數據量的查詢,一個索引的建立,讓你的程序運行效率提升多個檔次。所以,中高級開發工程師必須具備SQL優化的能力。上面的優化方案不是很全。但是一些基本的優化都已經給出瞭解決方案。如有問題,大家積極在留言區進行指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章