索引
索引的功能
當表中有大量記錄時,若要基於某些過濾條件對表進行查詢,就需要遍歷整張表和查詢條件進行對比,返回滿足條件的記錄。使用暴力搜索的時間復雜度是 O(n),同時頻繁訪問磁盤,當數據量達到一定的規模時(一般是 10 萬級別以上)效率很低。

索引是對數據表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息,提高檢索速度。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。如果 SELECT 的條件所在的列具有索引,則可以直接在索引中找到符合查詢條件的索引值,進而快速找到表中對應的記錄。索引是某個表中一列或若干列值的集合,和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引提供指向存儲在表的指定列中的數據值的指針,然后根據指定的排序順序對這些指針排序。

索引的優點和缺點
創建索引有以下 4 個優點:
- 大大加快數據的檢索速度;
- 保證表中每一行數據的唯一性;
- 加速表和表之間的連接;
- 在使用分組和排序子句進行數據檢索時,顯著減少時間開銷。
創建索引有以下 2 個缺點:
- 創建索引需要占物理空間;
- 表中的數據產生變動的時候,索引也要動態地維護。
索引的分類
按照存儲結構,索引分為普通索引和非聚簇索引。聚集索引是按照數據存放的物理位置為順序的索引,在聚集索引上的查詢速度最快。每一個數據表只能有一個聚集索引,這是因為物理數據只能有一種排序規則。非聚集索引建立在專門的索引列和索引文件,按照設定的順序進行排列后的結果數據保存到數據表中,對於單行記錄的查詢效率很高。
如何理解這 2 種索引?例如查字典有 3 種方法,分別是拼音查字法、部首查字法和筆畫查字法。聚集索引可以類比為拼音查字法,因為字典中的所有的字都按照拼音來排列的,是唯一確定的排列方式。非聚集索引可以類比為部首查字法或筆畫查字法,這 2 種查字法分別對應了部首和筆畫,當我們使用筆畫或者部首進行檢索時使用這 2 種方法查詢效率高。
SQL 語法
創建索引
創建索引時,首先需要確定表的索引列。如果表沒有主鍵約束,則可以創建聚集索引,但如果有主鍵約束就只能創建非聚集索引。建立索引的命令格式是:
CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
INDEX 索引名
ON 表名 | 視圖名 (列 [ASC|DESC][,…n])
| 關鍵字 | 功能 |
|---|---|
| UNIQUE | 表示創建的索引具有唯一性 |
| CLUSTERED | 指明創建的索引為聚集索引 |
| NONCLUSTERED | 指明創建的索引為非聚集索引 |
| ASC、DESC | 指定特定的索引列的排序方式為升序(默認)或降序 |
刪除索引
刪除索引同樣是用 DROP 命令實現,格式是:
DROP INDEX 表名.索引名[,…]
樣例
假設 Student 表中有如下一些數據:

創建簡單索引
為 Student 表的 Sname 字段進行創建。
CREATE INDEX sname_ind ON student (Sname)
創建唯一索引
為 Student 表的 Sname 字段進行創建。
CREATE UNIQUE INDEX sname_UNI_ind ON student (Sname)
此時對表使用如下 UPDATE 語句時會插入失敗,因為創建索引時再 Sname 字段創建了唯一索引,也就是說 Sname 應該是要唯一的.然而插入的數據中重復插入了 Sname 數據“曾華慶”,產生了重復所以不行。
INSERT Student VALUES('110', '曾華慶', '男', '1999-09-01', '95033')
創建唯一聚集索引
為 Student 表的 Sname 字段進行創建,注意如果表中已經存在了聚集索引,則不能創建多個聚集索引。
CREATE UNIQUE CLUSTERED INDEX sno_cl_ind ON student (sno)
創建組合索引
同時指定 class 和 sbirthday 作為索引列。
CREATE INDEX classs_bith_ind ON student (class, sbirthday)
創建視圖索引
創建索引視圖的時候需要指定表所屬的架構,需要在創建視圖語句中加上 WITH SCHEMABINDING。對視圖創建索引時,表的表達式必須使用兩段式 dbo.mytable 否則會報錯。
CREATE VIEW V WITH SCHEMABINDING
AS
SELECT s.Sno, Sname, Class, Sbirthday FROM dbo.student s
刪除索引
刪除上述建的全部索引。
DROP INDEX Student.sname_ind
DROP INDEX Student.sname_UNI_ind
DROP INDEX Student.classs_bith_ind
參考資料
《SqlServer 2014 數據庫技術實用教程》,胡伏湘、肖玉朝 主編,清華大學出版社
