深入理解數據庫索引
什麼是索引
1. 索引是指針,指向表裏的數據。
2. 索引通常與相應的表示分開存儲的,其主要目的是提高數據檢索的性能。
3. 索引的創建於刪除不會影響到數據本身,但會影響到數據檢索的速度。
4. 索引也會佔用表空間,而且可能會比表本身大
聚集索引(clustered index,也稱聚類索引、簇集索引)
聚集索引是指數據庫錶行中數據的物理順序與鍵值的邏輯(索引)順序相同。
一個表只能有一個聚集索引,因爲一個表的物理順序只有一種情況,所以,對應的聚集索引只能有一個。
舉例:
- 定義數據庫時定義一個自增id字段(物理存儲也按照這個id自增)
- 字典存儲中,按照拼音排序,字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。
非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)
該索引中索引的邏輯順序與磁盤上行的物理存儲順序不同。
數據行不按非聚集索引鍵的順序排序和存儲。
如何使用 聚集索引與非聚集索引
動作描述 | 使用聚集索引 | 使用非聚集索引 |
---|---|---|
列經常被分組排序 | 應 | 應 |
返回某範圍內的數據 | 應 | 不應 |
一個或極少不同值 | 不應 | 不應 |
小數目的不同值 | 應 | 不應 |
大數目的不同值 | 不應 | 應 |
頻繁更新的列 | 不應 | 應 |
外鍵列 | 應 | 應 |
主鍵列 | 應 | 應 |
頻繁修改索引列 | 不應 | 應 |
索引如何工作
索引分類
單字段索引
基於一個字段創建的索引
CREATE INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
唯一索引
唯一索引不允許表裏有重複值,除此之外與普通索引相同。
CREATE UNIQUE INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
注: 允許NULL值得字段上不能創建唯一索引
組合索引
基於表裏的兩個或多個字段建立的索引。
在創建組合索引時,需要考慮性能的問題,因爲字段在索引裏的順序對數據檢索的速度有很大影響。
CREATE INDEX INDEX_NAME
ON TABLE_NAME(COLUMN1,COLUMN2)
隱含索引
隱含索引是數據庫服務程序在創建對象時,自動創建的。
數據會爲主鍵約束和唯一性約束自動創建索引。(主鍵和唯一性約束在插入數據時都需要檢查唯一性,建立索引可以使唯一性檢查效率更高)