索引(Index)好比書的目錄,當進行檢索時不必掃描整個表,就可以迅速的找到表中的資料。
書要製作目錄可以方便尋找,但也需要紙張來儲存目錄資訊,如果增加或刪除了書的內容,那麼
目錄必定也要做修改,索引與之類似,可以快速檢索,但也需要一定的記憶體開銷以及維護開銷。
首先先解釋下索引是如何快速找到資料的?
索引是一個單獨的、物理的分散儲存資料庫結構。它是針對一個表建立的,每個索引
頁面中的行都含有邏輯指標,指向資料庫表中的物理位置。在進行檢索的時候,總是先
檢索索引頁,找到指向所需資料的指標,然後通過該指標找到資料頁面讀取資料,提高查詢效率。
建立索引頁必然要佔用一部分記憶體,同時增加、刪除、修改的時候也要花費時間去維護索引,
所以選擇合適的列建立索引是很必要的。
那麼該選擇怎樣的列建立索引呢?
1、主鍵列:存取最常用的列便是主鍵。
2、外鍵列:外鍵通常要與其它表進行關聯查詢,將其設定為索引,可以更加快速的進行串連
3、經常被作為條件檢索的列和按排序頻繁檢索的列。
選擇好列還要遵循一定的建立索引原則,如下:
1、資料量很少的表不要建立索引,因為資料太少,索引的效果不明顯,還得花時間維護。
2、對檢索的欄位有很多資料值或空值,為其建立索引,可以大大提高檢索速度。
3、在對錶中的資料進行大量更新時最後先刪除索引在更新,然後在建立索引。
4、在模糊查詢時盡量不要使用like '%某某%' ,而使用like '某%'
5、少用全表索引
知道原則了,那麼開始建立索引了,一般索引分為叢集索引(簇索引)和非叢集索引(非簇索引),
其建立都是用CREATE INDEX,指示建立叢集索引時要顯示聲明CLUSTERED。
例如對StudentInfo表中的No列和Name列建立降序非叢集索引或叢集索引,可以這樣寫:
CREATE [CLUSTERED] INDEX indexName_stuInfo ON StudentInfo(No,Name DESC)
[CLUSTERED]表示可選,選擇則建立聚集所以。
注意:叢集索引一張表只能建一個,故在對一張表建立叢集索引前要先刪除原來的叢集索引。
如:IF EXISTS(SELECT NAME FROM SYS.INDEXES WHERE NAME ='indexName_stuInfo')
DROP INDEX StudentInfo.indexName_stuInfo
GO
CREATE CLUSTERED INDEX indexName_stuInfo ON StudentInfo(No,Name DESC)
GO
*******************************下回介紹維護索引********************************************