關(guān)系型數(shù)據(jù)庫(kù)優(yōu)化:
1.對(duì)數(shù)據(jù)結(jié)構(gòu)優(yōu)化,通過業(yè)務(wù)邏輯簡(jiǎn)化結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、簡(jiǎn)化冗余字段
2.通過T-sql語(yǔ)句進(jìn)行優(yōu)化;包括sql語(yǔ)句的優(yōu)化、建立索引、規(guī)范sql語(yǔ)句的書寫(根據(jù)sql代碼的執(zhí)行原理)
3.金錢加成,添加服務(wù)器,分布式集群來解決問題
注釋:業(yè)務(wù)邏輯上的優(yōu)化,工作量比較大,要求業(yè)務(wù)和開發(fā)人員的密切配合,保證對(duì)每一個(gè)小細(xì)節(jié)的邏輯能解釋清楚,所帶來的風(fēng)險(xiǎn)也比較大,很多企業(yè)不會(huì)這么做,但是這也是最根本的解決性能問題;T-sql語(yǔ)句優(yōu)化,要求技術(shù)性比較高,對(duì)數(shù)據(jù)原理和T-sql程序的基礎(chǔ)比較了解;添加服務(wù)器方法,需要資金和相關(guān)運(yùn)維人員;
今天就說說對(duì)T-sql代碼的優(yōu)化:
索引分類:
存儲(chǔ)結(jié)構(gòu):聚簇索引,非聚簇索引
唯一性區(qū)分:唯一索引,非唯一索引
列個(gè)數(shù):?jiǎn)瘟兴饕嗔兴饕?br/>索引使用注意事項(xiàng):
1)索引并不是越多越好,要根據(jù)查詢有針對(duì)性的創(chuàng)建,考慮在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根據(jù) EXPLAIN 來查看是否用了索引還是全表掃描。
2)應(yīng)盡量避免在 WHERE 子句中對(duì)字段進(jìn)行 NULL 值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
3)值分布很稀少的字段不適合建索引,例如“性別”這種只有兩三個(gè)值的字段。
4)字符字段只建前綴索引。
5)字符字段最好不要做主鍵。
6)不用外鍵,由程序保證約束
7)盡量不用 UNIQUE,由程序保證約束。
8)使用多列索引時(shí)注意順序和查詢條件保持一致,同時(shí)刪除不必要的單列索引。
聚集索引:每張表只能有一個(gè)聚集索引;一種對(duì)磁盤上實(shí)際數(shù)據(jù)重新組織以按指定的一列或多列值排序,是用平衡二叉樹
非聚集索引:每張表可以有多個(gè)非聚集索引;默認(rèn)情況下建立的索引是非聚集索引,他不重新組織表中的數(shù)據(jù),而是對(duì)每一行存儲(chǔ)索引列值并用一個(gè)指針指向數(shù)據(jù)所在的頁(yè)面。每個(gè)非聚集索引根據(jù)索引列的不同提供不同的排序順序。
索引設(shè)計(jì)原則:
1)系統(tǒng)一般會(huì)給逐漸字段自動(dòng)建立聚集索引。
2)有大量重復(fù)值且經(jīng)常有范圍查詢和排序、分組的列,或者經(jīng)常頻繁訪問的列,考慮建立聚集索引。
3)在一個(gè)經(jīng)常做插入操作的表中建立索引,應(yīng)使用fillfactor(填充因子)來減少頁(yè)分裂,同時(shí)提高并發(fā)度降低死鎖的發(fā)生。如果在表為只讀表,填充因子可設(shè)為100
4)在選擇索引鍵時(shí),盡可能采用小數(shù)據(jù)類型的列作為鍵以使每個(gè)索引頁(yè)能容納盡可能多的索引鍵和指針,通過這種方式,可使一個(gè)查詢必需遍歷的索引頁(yè)面降低到最小,此外,盡可能的使用整數(shù)做為鍵值,因?yàn)檎麛?shù)的訪問速度最快。
Sql查詢的邏輯執(zhí)行順序:
① From:對(duì)FROM子句中前兩個(gè)表執(zhí)行笛卡爾積生成虛擬表vt1
② On :對(duì)vt1表應(yīng)用ON篩選器只有滿足 為真的行才被插入vt2
③ Join:如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個(gè)以上表則對(duì)上一個(gè)聯(lián)結(jié)生成的結(jié)果表和下一個(gè)表重復(fù)執(zhí)行步驟和步驟直接結(jié)束
④ Where :對(duì)vt3應(yīng)用 WHERE 篩選器只有使 為true的行才被插入vt4
⑤ Group by :按GROUP BY子句中的列列表對(duì)vt4中的行分組生成vt5
⑥ With:
⑦ Having :對(duì)vt6應(yīng)用HAVING篩選器只有使 為true的組才插入vt7
⑧ Select :處理select列表產(chǎn)生vt8
⑨ Distinct:將重復(fù)的行從vt8中去除產(chǎn)生vt9
⑩ Order by :將vt9的行按order by子句中的列列表排序生成一個(gè)游標(biāo)vc10
? Top :從vc10的開始處選擇指定數(shù)量或比例的行生成vt11 并返回調(diào)用者
索引查找(seek),一般為最優(yōu)(但查找也要看查找的篩選性),盡量吧where 條件中的字段建成一個(gè)組合索引,并且包含要查詢select 中的字段。
需要你的條件可以用索引!比如 你的語(yǔ)句中 索引列不能帶函數(shù),不能參與計(jì)算如 where productID/2 = @a ,不能有隱式轉(zhuǎn)換等!
最經(jīng)典的例子就是where 和 having的區(qū)別,看過語(yǔ)句執(zhí)行順序你應(yīng)該已經(jīng)明白了。能寫在where 中不要放在having中
橫向來看:
不要寫SELECT * 的語(yǔ)句,而是選擇你需要的字段。
當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上.這樣一來,就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤。
縱向來看:
where 條件要盡量的多且保證高篩選性。
業(yè)務(wù)中很常見要返回大批量數(shù)據(jù)到前端,但是這些數(shù)據(jù)真的都是必要的么?前端是否可以加一些默認(rèn)條件呢?
Sql代碼上層次上的優(yōu)化:
分庫(kù):通過添加服務(wù)器,用硬件去分擔(dān)數(shù)據(jù)帶來的壓力
分表:合理的利用服務(wù)器性能,服務(wù)器性能最優(yōu)化,保證單表數(shù)據(jù)不會(huì)太大
想法:橫向和縱向
橫向:通過業(yè)務(wù)邏輯對(duì)模塊進(jìn)行分庫(kù)劃分,保證每一個(gè)模塊的數(shù)據(jù)再不同的服務(wù)器上,獨(dú)立運(yùn)行
縱向:一個(gè)模塊的數(shù)據(jù)表進(jìn)行劃分,保證每一張表數(shù)據(jù)不會(huì)太多,通過算法保證分表數(shù)據(jù)的平衡性
缺點(diǎn):1.事務(wù)執(zhí)行
2.數(shù)據(jù)關(guān)聯(lián)和統(tǒng)計(jì)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文標(biāo)題:sql優(yōu)化-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://www.rwnh.cn/article46/copchg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、企業(yè)建站、網(wǎng)站策劃、網(wǎng)站導(dǎo)航、網(wǎng)站收錄、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)