通常資料庫在尋找資料是逐行檢查,看看每一筆資料是否符合條件,若符合則拿出,不符合就往下一筆直到結束,稱為Full table scan。
隨著資料量越來越大,查找的時間也會跟著變慢,使用Index可以加快查詢速度。
若在某欄位設定Index,資料庫會另外建立一張表,用於對應該欄位與完整資料,並採用Binary Search Algorithm或更快的演算法取得資料,以達成加快搜尋的目的。
資料結構方面通常會使用Hash或B-tree實作。 Hash通常用於儲存不能重複的資料,例如Primary Index或Unique Index。 B-tree則適合儲存允許重複的值,例如Non-Unique Index
索引的缺點
- 使用索引會額外建立一張表,拿空間換取時間
- 在更動資料時會連動到索引表,若該表會頻繁修改則會對資料庫造成負擔
叢集索引(Clustered Index)
- 一個資料表只會有一個叢集索引,通常是主鍵(Primary Key)欄位
- 資料表會直接依照叢集索引的順序排列,搜尋速度會非常快速
- 實體的資料表與索引表的順序是一樣的
非叢集索引(Non-Clustered Index)
- 一個資料表中可以有多個非叢集索引
- 不會變動資料表的順序,只會在索引表中依照索引欄位自行排序
使用索引的時機
- 主鍵 Primary Key
- 外部鍵 Foreign Key
- 常被放在ORDER, WHERE, GROUP等查詢的欄位