溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

sql語句的優(yōu)化方法有哪些

發(fā)布時(shí)間:2020-08-26 10:32:58 來源:億速云 閱讀:677 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

小編給大家分享一下sql語句的優(yōu)化方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

sql語句優(yōu)化的幾種方法有:1、統(tǒng)一SQL語句的格式;2、對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描;3、SQL語句要簡(jiǎn)潔;4、考慮使用“臨時(shí)表”暫存中間結(jié)果;5、盡量避免大事務(wù)操作;6、盡量避免向客戶端返回大數(shù)據(jù)量。

sql語句的優(yōu)化方法有哪些

我們開發(fā)項(xiàng)目上線初期,由于業(yè)務(wù)數(shù)據(jù)量相對(duì)較少,一些SQL的執(zhí)行效率對(duì)程序運(yùn)行效率的影響不太明顯,而開發(fā)和運(yùn)維人員也無法判斷SQL對(duì)程序的運(yùn)行效率有多大,故很少針對(duì)SQL進(jìn)行專門的優(yōu)化,而隨著時(shí)間的積累,業(yè)務(wù)數(shù)據(jù)量的增多,SQL的執(zhí)行效率對(duì)程序的運(yùn)行效率的影響逐漸增大,此時(shí)對(duì)SQL的優(yōu)化就很有必要。

sql語句優(yōu)化的幾種方法:

1、統(tǒng)一SQL語句的格式

對(duì)于以下兩句SQL語句,很多人認(rèn)為是相同的,但是,數(shù)據(jù)庫(kù)查詢優(yōu)化器認(rèn)為是不同的。

 ● select * from dual

 ● select * From dual

雖然只是大小寫不同,查詢分析器就認(rèn)為是兩句不同的SQL語句,必須進(jìn)行兩次解析。生成2個(gè)執(zhí)行計(jì)劃。所以作為程序員,應(yīng)該保證相同的查詢語句在任何地方都一致,多一個(gè)空格都不行!

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

3、對(duì)查詢進(jìn)行優(yōu)化,應(yīng)盡量避免全表掃描

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

2)、應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:

select id from t where num is null

可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:

select id from t where num=0

3)、應(yīng)盡量避免在 where 子句中使用!=或<>操作符,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描

4)、應(yīng)盡量避免在 where 子句中使用 or 來連接條件,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,如:

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,否則會(huì)導(dǎo)致全表掃描,如:

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

對(duì)于連續(xù)的數(shù)值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

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

有的時(shí)候會(huì)需要進(jìn)行一些模糊查詢比如:

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

關(guān)鍵詞 %yue%,由于yue前面用到了“%”,因此該查詢必然走全表掃描,除非必要,否則不要在關(guān)鍵詞前加%

7)、應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:

select id from t where num/2=100

應(yīng)改為:

select id from t where num=100*2

8)、應(yīng)盡量避免在where子句中對(duì)字段進(jìn)行函數(shù)操作,這將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。如:

查詢name以abc開頭的id

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

應(yīng)改為:

select id from t where name like 'abc%'

4、用 exists 代替 in

很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇,Exists只檢查存在性,性能比in強(qiáng)很多。例:

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語句寫得太長(zhǎng),太過冗余、要簡(jiǎn)潔;能用一句千萬不要用兩句

一般,將一個(gè)Select語句的結(jié)果作為子集,然后從該子集中再進(jìn)行查詢,這種一層嵌套語句還是比較常見的,但是根據(jù)經(jīng)驗(yàn),超過3層嵌套,查詢優(yōu)化器就很容易給出錯(cuò)誤的執(zhí)行計(jì)劃。因?yàn)樗焕@暈了。像這種類似人工智能的東西,終究比人的分辨力要差些,如果人都看暈了,我可以保證數(shù)據(jù)庫(kù)也會(huì)暈的。

另外,執(zhí)行計(jì)劃是可以被重用的,越簡(jiǎn)單的SQL語句被重用的可能性越高。而復(fù)雜的SQL語句只要有一個(gè)字符發(fā)生變化就必須重新解析,然后再把這一大堆垃圾塞在內(nèi)存里??上攵瑪?shù)據(jù)庫(kù)的效率會(huì)何等低下。

6、考慮使用“臨時(shí)表”暫存中間結(jié)果

簡(jiǎn)化SQL語句的重要方法就是采用臨時(shí)表暫存中間結(jié)果,但是,臨時(shí)表的好處遠(yuǎn)遠(yuǎn)不止這些,將臨時(shí)結(jié)果暫存在臨時(shí)表,后面的查詢就在tempdb中了,這可以避免程序中多次掃描主表,也大大減少了程序執(zhí)行中“共享鎖”阻塞“更新鎖”,減少了阻塞,提高了并發(fā)性能。

7、在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,    否則該索引將不會(huì)被使用,并且應(yīng)盡可能的讓字段順序與索引順序相一致。

8、盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設(shè)計(jì)為字符型,這會(huì)降低查詢和連接的性能,并會(huì)增加存儲(chǔ)開銷。    
這是因?yàn)橐嬖谔幚聿樵兒瓦B接時(shí)會(huì)逐個(gè)比較字符串中每一個(gè)字符,而對(duì)于數(shù)字型而言只需要比較一次就夠了。

9、盡可能的使用 varchar 代替 char ,因?yàn)槭紫茸冮L(zhǎng)字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間,    其次對(duì)于查詢來說,在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。

10、避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。

11、盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差,如果游標(biāo)操作的數(shù)據(jù)超過1萬行,那么就應(yīng)該考慮改寫。

12、盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。

13、盡量避免向客戶端返回大數(shù)據(jù)量,若數(shù)據(jù)量過大,應(yīng)該考慮相應(yīng)需求是否合理。

以上是sql語句的優(yōu)化方法有哪些的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

sql
AI