SQL——索引
索引
可以在表中建立索引,以便更加快速高效地查詢資料,並且使用者無法看到索引,它們只能被用來加速搜尋/查詢(在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料)。
SQL索引有兩種,聚集索引和非聚集索引。
注意:更新一個包含索引的表需要比更新一個沒有索引的表更多的時間,這是由於索引本身也需要更新。因此,理想的做法是僅僅在常常被搜尋的列(以及表)上面建立索引。
語法
CREATE [UNIQUE][CLUSTERED | NONCLUSTERED] INDEX 索引名稱 ON {表名稱 | 檢視名稱} [WITH [index_property [,....n]]; UNIQUE: 建立唯一索引。 CLUSTERED: 建立聚集索引。 NONCLUSTERED: 建立非聚集索引。 Index_property: 索引屬性。 UNIQUE索引既可以採用聚集索引結構,也可以採用非聚集索引的結構。 若不指明採用的索引結構,則資料庫管理系統預設為採用非聚集索引結構。
索引的儲存機制
無索引的表,查詢時,是按照順序存續的方法掃描每個記錄來查詢符合條件的記錄,即按照從頭到尾的順序進行查詢,知道找到為止,這樣效率十分低下。
聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引就是在資料庫被開闢一個物理空間存放他的排列的值,例如1-100,所以當插入資料時,會重新排列整個整個物理空間。
聚集索引就是搜尋順序按照順序(1,2,3,4,5,6,7……或是A~Z的順序)進行查詢搜尋。
非聚集索引:例如,就和按照部首查詢是一樣是,可能按照偏房查詢的時候,根據偏旁‘弓’字旁,索引出兩個漢字,張和弘,但是這兩個其實一個在100頁,一個在1000頁,他們的索引順序和資料庫表的排列順序是不一樣的,這個樣的就是非聚集索引。非聚集索引其實可以看作是一個含有聚集索引的表,只僅包含原表中非聚集索引的列和指向實際物理表的指標,只記錄一個指標,其實就有點和堆疊差不多的感覺了
建立索引的原則:
1) 定義主鍵的資料列一定要建立索引。
2) 定義有外來鍵的資料列一定要建立索引。
3) 對於經常查詢的資料列最好建立索引。
4) 對於需要在指定範圍內的快速或頻繁查詢的資料列;
5) 經常用在WHERE子句中的資料列。
6) 經常出現在關鍵字order by、group by、distinct後面的欄位,建立索引。如果建立的是複合索引,索引的欄位順序要和這些關鍵字後面的欄位順序一致,否則索引不會被使用。
7) 對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。
8) 對於定義為text、image和bit的資料型別的列不要建立索引。
9) 對於經常存取的列避免建立索引
9) 限制表上的索引數目。對一個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響資料的更新操作。
10) 對複合索引,按照欄位在查詢條件中出現的頻度建立索引。在複合索引中,記錄首先按照第一個欄位排序。對於在第一個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有複合索引的第一個欄位出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的欄位,放置在複合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。