教你一招:MSSQL資料庫索引的應用

來源:互聯網
上載者:User

一、索引的概念

索引就是加快檢索表中資料的方法。資料庫的索引類似於書籍的索引。在書籍中,索引允許使用者不必翻閱完整個書就能迅速地找到所需要的資訊。在資料庫中,索引也允許資料庫程式迅速地找到表中的資料,而不必掃描整個資料庫。

二、索引的特點

1.索引可以加快資料庫的檢索速度

2.索引降低了資料庫插入、修改、刪除等維護任務的速度

3.索引建立在表上,不能建立在視圖上

4.索引既可以直接建立,也可以間接建立

5.可以在最佳化隱藏中,使用索引

6.使用查詢處理器執行SQL語句,在一個表上,一次只能使用一個索引

7.其他

三、索引的優點

1.建立唯一性索引,保證資料庫表中每一行資料的唯一性

2.大大加快資料的檢索速度,這也是建立索引的最主要的原因

3.加速表和表之間的串連,特別是在實現資料的參考完整性方面特別有意義。

4.在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。

5.通過使用索引,可以在查詢的過程中使用最佳化隱藏器,提高系統的效能。

四、索引的缺點

1.建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加

2.索引需要佔物理空間,除了資料表占資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大

3.當對錶中的資料進行增加、刪除和修改的時候,索引也要動態維護,降低了資料的維護速度

五、索引分類

1.直接建立索引和間接建立索引

直接建立索引: CREATE INDEX mycolumn_index ON mytable (myclumn)

間接建立索引:定義主鍵約束或者唯一性鍵約束,可以間接建立索引

2.普通索引和唯一性索引

普通索引:

CREATE INDEX mycolumn_index ON mytable (myclumn)

唯一性索引:保證在索引列中的全部資料是唯一的,對聚簇索引和非聚簇索引都可以使用

CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)

3.單個索引和複合索引

單個索引:即非複合索引

複合索引:又叫複合式索引,在索引建立語句中同時包含多個欄位名,最多16個欄位

CREATE INDEX name_index ON username(firstname,lastname)

4.聚簇索引和非聚簇索引(叢集索引,群集索引)

聚簇索引:物理索引,與基表的物理順序相同,資料值的順序總是按照順序排列

CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH

ALLOW_DUP_ROW(允許有重複記錄的聚簇索引)

非聚簇索引:

CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)

六、索引的使用

1.當欄位資料更新頻率較低,查詢使用頻率較高並且存在大量重複值是建議使用聚簇索引

2.經常同時存取多列,且每列都含有重複值可考慮建立複合式索引

3.複合索引的前置列一定好控制好,否則無法起到索引的效果。如果查詢時前置列不在查詢條件中則該複合索引不會被使用。前置列一定是使用最頻繁的列

4.多表操作在被實際執行前,查詢最佳化工具會根據串連條件,列出幾組可能的串連方案並從中找出系統開銷最小的最佳方案。串連條件要充份考慮帶有索引的表、行數多的表;內外表的選擇可由公式:外層表中的匹配行數靠內層表中每一次尋找的次數確定,乘積最小為最佳方案

5.where子句中對列的任何操作結果都是在sql運行時逐列計算得到的,因此它不得不進行表搜尋,而沒有使用該列上面的索引;如果這些結果在查詢編譯時間就能得到,那麼就可以被sql最佳化器最佳化,使用索引,避免表搜尋。

例:

以下為引用的內容:
select * from record where substring(card_no,1,4)=’5378’
            && select * from record where card_no like ’5378%’

任何對列的操作都將導致表掃描,它包括資料庫函數、計算運算式等等,查詢時要儘可能將操作移至等號右邊

6.where條件中的’in’在邏輯上相當於’or’,所以文法分析器會將in ('0','1')轉化為column='0' or column='1'來執行。我們期望它會根據每個or子句分別尋找,再將結果相加,這樣可以利用column上的索引;但實際上它卻採用了"or策略",即先取出滿足每個or子句的行,存入臨時資料庫的工作表中,再建立唯一索引以去掉重複行,最後從這個暫存資料表中計算結果。因此,實際過程沒有利用column上索引,並且完成時間還要受tempdb資料庫效能的影響。in、or子句常會使用工作表,使索引失效;如果不產生大量重複值,可以考慮把子句拆開;拆開的子句中應該包含索引

7.要善於使用預存程序,它使sql變得更加靈活和高效



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。