溫馨提示×

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

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

SQL語(yǔ)句及數(shù)據(jù)庫(kù)優(yōu)化

發(fā)布時(shí)間:2020-08-07 05:49:56 來(lái)源:網(wǎng)絡(luò) 閱讀:376 作者:2585928364 欄目:數(shù)據(jù)庫(kù)

 1,統(tǒng)一SQL語(yǔ)句的寫(xiě)法

對(duì)于以下兩句SQL語(yǔ)句,程序員認(rèn)為是相同的,數(shù)據(jù)庫(kù)查詢(xún)優(yōu)化器認(rèn)為是不同的。 所以封裝成復(fù)用方法,用標(biāo)準(zhǔn)模板來(lái)控制。

select*from dual 

select*From dual

其實(shí)就是大小寫(xiě)不同,查詢(xún)分析器就認(rèn)為是兩句不同的SQL語(yǔ)句,必須進(jìn)行兩次解析。生成2個(gè)執(zhí)行計(jì)劃

2,不要把SQL語(yǔ)句寫(xiě)得太復(fù)雜

我經(jīng)??吹剑瑥臄?shù)據(jù)庫(kù)中捕捉到的一條SQL語(yǔ)句打印出來(lái)有2張A4紙這么長(zhǎng)。一般來(lái)說(shuō)這么復(fù)雜的語(yǔ)句通常都是有問(wèn)題的。我拿著這2頁(yè)長(zhǎng)的SQL語(yǔ)句去請(qǐng)教原作者,結(jié)果他說(shuō)時(shí)間太長(zhǎng),他一時(shí)也看不懂了??上攵B原作者都有可能看糊涂的SQL語(yǔ)句,數(shù)據(jù)庫(kù)也一樣會(huì)看糊涂。

 

比如 Select語(yǔ)句的結(jié)果作為子集

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

 

3,必須采用綁定變量 

select*from orderheader where changetime >‘2010-10-20 00:00:01‘ 
select*from orderheader where changetime >‘2010-09-22 00:00:01‘


以上兩句語(yǔ)句,查詢(xún)優(yōu)化器認(rèn)為是不同的SQL語(yǔ)句,需要解析兩次。如果采用綁定變量

select*from orderheader where changetime >@chgtime

 

4,使用like進(jìn)行模糊查詢(xún)時(shí)應(yīng)注意

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

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

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

 

5,聯(lián)表查詢(xún)

(1)    連接字段盡量選擇聚集索引所在的字段

(2)    仔細(xì)考慮where條件,盡量減小A、B表的結(jié)果集

 獲取下載地址  springmvc+mybatis+spring 整合 bootstrap html5

6,索引,

看sql 的性能,主要看執(zhí)行計(jì)劃,還有cpu成本,io成本等。這里就以一個(gè)簡(jiǎn)單的表為例。

首先,創(chuàng)建一個(gè)簡(jiǎn)單的表,一般會(huì)先建個(gè)主鍵,系統(tǒng)自動(dòng)以主鍵建聚集索引。

判斷是否需要優(yōu)化sql的一個(gè)簡(jiǎn)單規(guī)則是:看執(zhí)行計(jì)劃中的操作是seek(搜索)還是scan(掃描)

是scan的話就要索引。

 

使用場(chǎng)景:

當(dāng)一個(gè)系統(tǒng)查詢(xún)比較頻繁,而新建,修改等操作比較少時(shí),可以創(chuàng)建覆蓋索引,將查詢(xún)字段和where子句里的字段全部包含在內(nèi),這樣查詢(xún)的速度會(huì)比以前快很多,同時(shí)也帶來(lái)弊端,就是新建或修改等操作時(shí),比沒(méi)有索引或沒(méi)有建立覆蓋索引時(shí)的要慢。讀寫(xiě)數(shù)據(jù)庫(kù)分離也能解決問(wèn)題

 

經(jīng)常對(duì)Creator_Id字段查詢(xún),就做個(gè)索引。

對(duì)表Article的Creator_Id字段建索引

CREATE INDEX Ix_article_creatorid ON Article(Creator_Id)

set statistics io 和 set statistics,這是性能調(diào)優(yōu)時(shí)查看相關(guān)cpu占用時(shí)間,IO資源數(shù)據(jù)的兩個(gè)比較重要的命令

 

記得Order by 語(yǔ)句加索引

 

7,讀寫(xiě)分離

 

當(dāng)主數(shù)據(jù)庫(kù)進(jìn)行寫(xiě)操作時(shí),數(shù)據(jù)要同步到從的數(shù)據(jù)庫(kù),這樣才能有效保證數(shù)據(jù)庫(kù)完整性

主從分離,對(duì)數(shù)據(jù)庫(kù)層面就是數(shù)據(jù)同步或者是數(shù)據(jù)復(fù)制;從應(yīng)用層講就是請(qǐng)求的分離:增刪改請(qǐng)求主庫(kù),查詢(xún)請(qǐng)求從庫(kù)

 

8,盡量不用select * from …..

 

,而要寫(xiě)字段名 select field1,field2,…這條沒(méi)什么好說(shuō)的,主要是按需查詢(xún),不要返回不必要的列和行。

 

9 任何對(duì)列的操作都將導(dǎo)致表掃描

它包括數(shù)據(jù)庫(kù)函數(shù)、計(jì)算表達(dá)式等,查詢(xún)時(shí)要盡可能將操作移至等號(hào)右邊

10 In 、or子句常會(huì)使索引失效

顯而易見(jiàn)的,IN,OR擴(kuò)大的查詢(xún)范圍。

11通常情況下,連接比子查詢(xún)效率要高

必然的,需要子查詢(xún)時(shí),也是用臨時(shí)表暫存中間結(jié)果


向AI問(wèn)一下細(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)容。

AI