什麼是索引,有什麼優勢?

答:索引象書的目錄相似,索引使數據庫程序無需掃描整個表,就能夠在其中找到所須要的數據,索引包含了一個表中包含值的列表,其中包含了各個值的行所存儲的位置,索引能夠是單個或一組列,索引提供的表中數據的邏輯位置,合理劃分索引可以大大提升數據庫性能。數據庫

索引的概念性能

索引的用途:咱們對數據查詢及處理速度已成爲衡量應用系統成敗的標準,而採用索引來加快數據處理速度一般是最廣泛採用的優化方法。優化

索引是什麼:數據庫中的索引相似於一本書的目錄,在一本書中使用目錄能夠快速找到你想要的信息,而不須要讀徹底書。在數據庫中,數據庫程序使用索引能夠重啊到表中的數據,而沒必要掃描整個表。書中的目錄是一個字詞以及各字詞所在的頁碼列表,數據庫中的索引是表中的值以及各值存儲位置的列表。spa

索引的利弊:查詢執行的大部分開銷是I/O,使用索引提升性能的一個主要目標是避免全表掃描,由於全表掃描須要從磁盤上讀取表的每個數據頁,若是有索引指向數據值,則查詢只須要讀少數次的磁盤就行啦。因此合理的使用索引能加速數據的查詢。可是索引並不老是提升系統的性能,帶索引的表須要在數據庫中佔用更多的存儲空間,一樣用來增刪數據的命令運行時間以及維護索引所需的處理時間會更長。因此咱們要合理使用索引,及時更新去除次優索引。code

語法:排序

CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[with[PAD_INDEX][[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]
]
[ ON filegroup ]

CREATE INDEX命令建立索引各參數說明以下:索引

UNIQUE:用於指定爲表或視圖建立惟一索引,即不容許存在索引值相同的兩行。
CLUSTERED:用於指定建立的索引爲彙集索引。
NONCLUSTERED:用於指定建立的索引爲非彙集索引。
index_name:用於指定所建立的索引的名稱。
table:用於指定建立索引的表的名稱。
view:用於指定建立索引的視圖的名稱。
ASC|DESC:用於指定具體某個索引列的升序或降序排序方向。
Column:用於指定被索引的列。
PAD_INDEX:用於指定索引中間級中每一個頁(節點)上保持開放的空間。
FILLFACTOR = fillfactor:用於指定在建立索引時,每一個索引頁的數據佔索引頁大小的百分比,fillfactor的值爲1到100。
IGNORE_DUP_KEY:用於控制當往包含於一個惟一彙集索引中的列中插入重複數據時SQL Server所做的反應。
DROP_EXISTING:用於指定應刪除並從新建立已命名的先前存在的彙集索引或者非彙集索引。
STATISTICS_NORECOMPUTE:用於指定過時的索引統計不會自動從新計算。
SORT_IN_TEMPDB:用於指定建立索引時的中間排序結果將存儲在 tempdb 數據庫中。
ON filegroup:用於指定存放索引的文件組。ip

索引的建立與銷燬it

CREATE INDEX 關鍵字/DROP INDEX

基本語法:table

CREATE INDEX index_name ON table_name (列名1,列名2,......);

示例:

學生信息表:

clipboard.png

招生信息表:

clipboard.png

院系信息表:

clipboard.png

示例1:爲StudentInfo表中的sname字段建立非簇索引

CREATE INDEX Name_Index ON StudentInfo(sname)

查詢:

SELECT sname FROM StudentInfo

結果:

clipboard.png

強制使用Name_Index索引:

SELECT * FROM StudentInfo WITH (INDEX(Name_Index))

clipboard.png

使用ORDER BY關鍵字

SELECT * FROM StudentInfo ORDER BY sname

clipboard.png

雖然從表面上看,SELECT * FROM ...ORDER BY 獲得了相同的結果,可是,兩者從本質上有很大的區別。ORDER BY關鍵字在每次查詢數據時,都要對數據進行排序。而建立索引後,數據庫系統實際上建立了一個索引結構體,用戶每次使用查詢數據時,都是用相同的索引結構,從而節省了時間。

複合索引

CREATE INDEX SexName_Index ON StudentInfo(sex,sname);

強制使用該索引

SELECT * FROM StudentInfo WITH (INDEX(SexName_Index))

clipboard.png

在建立多字段索引時,各字段的排列順序決定了其優先級,排名越靠前,具備越高的優先級。

惟一索引:指不容許在兩行中存在相同的索引值

CREATE UNIQUE INDEX Sno_Index ON StudentInfo (sno DESC)

強制使用該索引

SELECT * FROM StudentInfo WITH (INDEX(Sno_Index))

clipboard.png

具備重複值字段的惟一性索引

CREATE UNIQUE INDEX Address_Index ON StudentInfo (address)

結果:

clipboard.png

簇索引

CREATE CLUSTERED INDEX Snameclester_Index ON StudentInfo (sname)
DROP INDEX StudentInfo.Snameclester_Index
CREATE CLUSTERED INDEX SexAddrssClustered_Index ON StudentInfo(sex,address)
相關文章
相關標籤/搜索