sql語句優化的幾種方法有:1、統一SQL語句的格式;2、對查詢進行優化,應盡量避免全表掃描;3、SQL語句要簡潔;4、考慮使用“臨時表”暫存中間結果;5、盡量避免大事務操作;6、盡量避免向客戶端返回大數據量。
我們開發項目上線初期,由于業務數據量相對較少,一些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 子句中使用!=或<>操作符,否則將導致引擎放棄使用索引而進行全表掃描
4)、應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num=10 or num=20
可以這樣查詢:
select id from t where num=10unionall 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
很多時候用 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、盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
(資料圖片)今天來聊聊關于門禁卡怎么區分id和ic,門禁卡是ic卡還是id卡的文章,現在就為大家來簡單介紹下門禁卡怎么區分id和ic,門禁卡是ic卡還是id卡,希望對各位小伙伴們有所幫助。1、如果是鑰匙扣卡 卡上可有一串10位的數字,如果是卡片樣式的 ,一般有兩串數字 前面10位 后面8位 這種就是ID卡。2、兩面都空白 就是IC卡,還有一種方法 拿到強光下面照射,里面線圈如果是圓的 就是ID...
(資料圖)在生活中,很多人都不知道微信掃碼群發怎么關閉是什么意思,其實他的意思是非常簡單的,下面就是小編搜索到的微信掃碼群發怎么關閉相關的一些知識,我們一起來學習下吧!微信掃碼群發關閉的方法如下:1、用手下載微信APP后,打開微信,登錄微信賬號,打開微信公眾號,下滑頁面點擊右下的“安全中心”選項。2、然后點擊“風險操作保護”選項后面的“詳情”選項。3、再點擊”群發消息“后面的“關閉保護”選項。4、...
背景:緊接AWS簡單搭建使用EKS一,eks集群簡單搭建完成。需要搭建有狀態服務必然就用到了storageclass 存儲類,這里用ebs記錄以下AWS簡單搭建使用EKS二存儲類選型:參照官方文檔:https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#the-storageclass-resourceimage.pn...