通常資料庫在尋找資料是逐行檢查,看看每一筆資料是否符合條件,若符合則拿出,不符合就往下一筆直到結束,稱為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等查詢的欄位
參考資料