首頁 >資料庫 >mysql教程 >sql語句如何最佳化?

sql語句如何最佳化?

青灯夜游
青灯夜游原創
2019-04-08 11:06:267653瀏覽

sql語句優化的幾種方法有:1、統一SQL語句的格式;2、對查詢進行最佳化,應盡量避免全表掃描;3、SQL語句要簡潔;4、考慮使用「臨時表」暫存中間結果;5、盡量避免大事務操作;6、盡量避免向客戶端傳回大資料量。以下這篇文章就來給大家具體介紹一些,希望對大家有幫助。

sql語句如何最佳化?

我們開發專案上線初期,由於業務資料量相對較少,一些SQL的執行效率對程式運作效率的影響不太明顯,而開發和維運人員也無法判斷SQL對程式的運作效率有多大,故很少針對SQL進行專門的最佳化,而隨著時間的積累,業務資料量的增多,SQL的執行效率對程式的運作效率的影響逐漸增大,此時對SQL的最佳化就很有必要。

sql語句最佳化的幾種方法:

#1、統一SQL語句的格式

#對於以下兩句SQL語句,很多人認為是相同的,但是,資料庫查詢最佳化器認為是不同的。

 ● select * from dual

 ● select * From dual

雖然只是大小寫不同,查詢分析器就認為是兩句不同的SQL語句,必須進行兩次解析。產生2個執行計劃。所以身為程式設計師,應該要保證相同的查詢語句在任何地方都一致,多一個空格都不行!

2、少用 * ,用具體的欄位清單取代“*”,不要傳回任何用不到的欄位。

3、對查詢進行最佳化,應盡量避免全表掃描

1)、應考慮在 where 及 order by 涉及的列上建立索引。

2)、應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:    

select id from t where num is null

#可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:    

select id from t where num=0

3)、應盡量避免在where 子句中使用!=或a8093152e673feb7aba1828c43532094運算子,否則會導致引擎放棄使用索引而進行全表掃描

4)、應盡量避免在where 子句中使用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

5)、慎用in 和not in,否則會導致全表掃描,如:    

select id from t where num in(1,2,3)

對於連續的數值,能用between 就不要用in 了:    

select id from t where num between 1 and 3

6)、合理使用like模糊查詢

有的時候會需要進行一些模糊查詢例如:

select * from contact where username like ‘%yue%’

關鍵字%yue%,由於yue前面用到了“%”,因此該查詢必然走全表掃描,除非必要,否則不要在關鍵字前加%

7)、應盡量避免在where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:    

select id from t where num/2=100

應改為:    

select id from t where num=100*2

8)、應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:    

查詢name以abc開頭的id   

select id from t where substring(name,1,3)='abc'

應改為:    

select id from t where name like 'abc%'

4、以exists 取代in 

4. #很多時候用exists 代替in 是一個好的選擇,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)

5、不要把SQL語句寫得太長,太過冗餘、簡潔;能用一句千萬不要用兩句

一般,將一個Select語句的結果當作子集,然後從該子集中再進行查詢,這種一層嵌套語句還是比較常見的,但是根據經驗,超過3層嵌套,查詢優化器就很容易給出錯誤的執行計劃。因為它被繞暈了。像這種類似人工智慧的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證資料庫也會暈的。

另外,執行計劃是可以重複使用的,越簡單的SQL語句被重複使用的可能性越高。而複雜的SQL語句只要有一個字元改變就必須重新解析,然後再把這一大堆垃圾塞在記憶體裡。可想而知,資料庫的效率會何等低下。

6、考慮使用「臨時表」暫存中間結果

###簡化SQL語句的重要方法就是採用臨時表暫存中間結果,但是,臨時表的好處遠遠不止這些,將臨時結果暫存在臨時表,後面的查詢就在tempdb中了,這可以避免程式中多次掃描主表,也大大減少了程式執行中“共享鎖”阻塞“更新鎖” ,減少了阻塞,提高了並發性能。 ###

7、在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,    否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相一致。

8、盡量使用數字型欄位,若只含數值資訊的欄位盡量不要設計為字元型,這會降低查詢和連接的效能,並會增加儲存開銷。    
這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字符,而對於數字型而言只需要比較一次就夠了。

9、盡可能的使用varchar 代替char ,因為首先變長字段存儲空間小,可以節省存儲空間,    其次對於查詢來說,在一個相對較小的字段內搜尋效率顯然要高些。    

10、避免經常建立和刪除臨時表,以減少系統表資源的消耗。

11、盡量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該考慮改寫。

12、盡量避免大事務操作,提高系統並發能力。

13、盡量避免向客戶端傳回大資料量,若資料量過大,應考慮對應需求是否合理。

相關影片教學推薦:《MySQL教學

以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。更多精彩內容大家可以追蹤php中文網相關教學欄位! ! !

以上是sql語句如何最佳化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn