以 mssql 為例子,索引主要區分叢集索引與非叢集索引,我們可以用一本書來做範例,這本書可以當作是一張資料表,目錄就可以當作是一個叢集索引,附錄就可以當作是一個非叢集索引。

叢集索引

  • 叢集索引會將資料依照索引排序與儲存,因為資料只能有一種排序,所以每張表只能有一個叢集索引。
  • 當資料表有包含叢集索引時資料才會以排序方式儲存,如果沒有則會存在未排序的結構中,又稱為堆積

非叢集索引

  • 非叢集索引的排列順序不會影響實際資料的排列方式,所以每張表可以有多個非叢集索引
  • 非叢集索引會有一個指標指向資料列,此指標稱為資料定位器,若該資料表是堆積(沒有叢集索引)則資料定位器會指向資料列,若是叢集資料表,則資料定位器會指向叢集索引鍵。

為什麼叢集索引比非叢集索引快?

因為非叢集所以是指向記憶體地址,而非實際存放的位置

什麼是 b-tree,如果從 1-10 怎麼排列?什麼又是 b+ tree?

以後再補

有使用過複合索引嗎?幫我簡單介紹

是將多個 key 值組合成索引鍵,例如(A+B+C)是一個複合索引,但需要注意的是最源頭的 A 一定要在查詢條件內才會使用的該索引

使用複合索引

A,A+B,A+B+C,A+C

未使用複合索引

B,B+C,C

什麼是含有資料行的非叢集索引?

在建立非叢集索引時,將所需要的欄位放入非叢集索引內,例如 A 是非叢集索引將 B,C 包含在 A 之中,則當查詢條件是 A 的時候,所要取得的資料欄位如果只有 A,B,C 可以增加效率 如果查詢條件多了一個 D 會需要額外的成本將 D 資料取出。

參考

SQL Server 及 Azure SQL 索引架構與設計指南

叢集與非叢集索引

索引是什麼 ? 為什麼加了索引查詢會變快|| What is indexing ? How the indexing makes SELECT queries faster?