sql優(yōu)化

關(guān)系型數(shù)據(jù)庫優(yōu)化:
1.對數(shù)據(jù)結(jié)構(gòu)優(yōu)化,通過業(yè)務(wù)邏輯簡化結(jié)構(gòu)、數(shù)據(jù)結(jié)構(gòu)、簡化冗余字段
2.通過T-sql語句進行優(yōu)化;包括sql語句的優(yōu)化、建立索引、規(guī)范sql語句的書寫(根據(jù)sql代碼的執(zhí)行原理)
3.金錢加成,添加服務(wù)器,分布式集群來解決問題
注釋:業(yè)務(wù)邏輯上的優(yōu)化,工作量比較大,要求業(yè)務(wù)和開發(fā)人員的密切配合,保證對每一個小細(xì)節(jié)的邏輯能解釋清楚,所帶來的風(fēng)險也比較大,很多企業(yè)不會這么做,但是這也是最根本的解決性能問題;T-sql語句優(yōu)化,要求技術(shù)性比較高,對數(shù)據(jù)原理和T-sql程序的基礎(chǔ)比較了解;添加服務(wù)器方法,需要資金和相關(guān)運維人員;
今天就說說對T-sql代碼的優(yōu)化:
索引分類:
存儲結(jié)構(gòu):聚簇索引,非聚簇索引
唯一性區(qū)分:唯一索引,非唯一索引
列個數(shù):單列索引,多列索引
索引使用注意事項:
1)索引并不是越多越好,要根據(jù)查詢有針對性的創(chuàng)建,考慮在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根據(jù) EXPLAIN 來查看是否用了索引還是全表掃描。
2)應(yīng)盡量避免在 WHERE 子句中對字段進行 NULL 值判斷,否則將導(dǎo)致引擎放棄使用索引而進行全表掃描。
3)值分布很稀少的字段不適合建索引,例如“性別”這種只有兩三個值的字段。
4)字符字段只建前綴索引。
5)字符字段最好不要做主鍵。
6)不用外鍵,由程序保證約束
7)盡量不用 UNIQUE,由程序保證約束。
8)使用多列索引時注意順序和查詢條件保持一致,同時刪除不必要的單列索引。
聚集索引:每張表只能有一個聚集索引;一種對磁盤上實際數(shù)據(jù)重新組織以按指定的一列或多列值排序,是用平衡二叉樹
非聚集索引:每張表可以有多個非聚集索引;默認(rèn)情況下建立的索引是非聚集索引,他不重新組織表中的數(shù)據(jù),而是對每一行存儲索引列值并用一個指針指向數(shù)據(jù)所在的頁面。每個非聚集索引根據(jù)索引列的不同提供不同的排序順序。
索引設(shè)計原則:
1)系統(tǒng)一般會給逐漸字段自動建立聚集索引。
2)有大量重復(fù)值且經(jīng)常有范圍查詢和排序、分組的列,或者經(jīng)常頻繁訪問的列,考慮建立聚集索引。
3)在一個經(jīng)常做插入操作的表中建立索引,應(yīng)使用fillfactor(填充因子)來減少頁分裂,同時提高并發(fā)度降低死鎖的發(fā)生。如果在表為只讀表,填充因子可設(shè)為100
4)在選擇索引鍵時,盡可能采用小數(shù)據(jù)類型的列作為鍵以使每個索引頁能容納盡可能多的索引鍵和指針,通過這種方式,可使一個查詢必需遍歷的索引頁面降低到最小,此外,盡可能的使用整數(shù)做為鍵值,因為整數(shù)的訪問速度最快。
Sql查詢的邏輯執(zhí)行順序:
① From:對FROM子句中前兩個表執(zhí)行笛卡爾積生成虛擬表vt1
② On :對vt1表應(yīng)用ON篩選器只有滿足 為真的行才被插入vt2
③ Join:如果指定了 OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯(lián)結(jié)生成的結(jié)果表和下一個表重復(fù)執(zhí)行步驟和步驟直接結(jié)束
④ Where :對vt3應(yīng)用 WHERE 篩選器只有使 為true的行才被插入vt4
⑤ Group by :按GROUP BY子句中的列列表對vt4中的行分組生成vt5
⑥ With:
⑦ Having :對vt6應(yīng)用HAVING篩選器只有使 為true的組才插入vt7
⑧ Select :處理select列表產(chǎn)生vt8
⑨ Distinct:將重復(fù)的行從vt8中去除產(chǎn)生vt9
⑩ Order by :將vt9的行按order by子句中的列列表排序生成一個游標(biāo)vc10
? Top :從vc10的開始處選擇指定數(shù)量或比例的行生成vt11 并返回調(diào)用者
索引查找(seek),一般為最優(yōu)(但查找也要看查找的篩選性),盡量吧where 條件中的字段建成一個組合索引,并且包含要查詢select 中的字段。
需要你的條件可以用索引!比如 你的語句中 索引列不能帶函數(shù),不能參與計算如 where productID/2 = @a ,不能有隱式轉(zhuǎn)換等!
最經(jīng)典的例子就是where 和 having的區(qū)別,看過語句執(zhí)行順序你應(yīng)該已經(jīng)明白了。能寫在where 中不要放在having中
橫向來看:
不要寫SELECT * 的語句,而是選擇你需要的字段。
當(dāng)在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤。
縱向來看:
where 條件要盡量的多且保證高篩選性。
業(yè)務(wù)中很常見要返回大批量數(shù)據(jù)到前端,但是這些數(shù)據(jù)真的都是必要的么?前端是否可以加一些默認(rèn)條件呢?

創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)順平,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220

Sql代碼上層次上的優(yōu)化:
分庫:通過添加服務(wù)器,用硬件去分擔(dān)數(shù)據(jù)帶來的壓力
分表:合理的利用服務(wù)器性能,服務(wù)器性能最優(yōu)化,保證單表數(shù)據(jù)不會太大
想法:橫向和縱向
橫向:通過業(yè)務(wù)邏輯對模塊進行分庫劃分,保證每一個模塊的數(shù)據(jù)再不同的服務(wù)器上,獨立運行
縱向:一個模塊的數(shù)據(jù)表進行劃分,保證每一張表數(shù)據(jù)不會太多,通過算法保證分表數(shù)據(jù)的平衡性
缺點:1.事務(wù)執(zhí)行
2.數(shù)據(jù)關(guān)聯(lián)和統(tǒng)計

標(biāo)題名稱:sql優(yōu)化
本文網(wǎng)址:http://muchs.cn/article42/ihsgec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站外貿(mào)建站、做網(wǎng)站營銷型網(wǎng)站建設(shè)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司