主索引 & 輔助索引
主索引
定義:將主文件分塊,每一塊對應一個索引項。每個存儲快的第一條記錄,又稱為錨記錄。主索引是按照索引字段值進行排序的一個有序文件,通常建立在有序文件的基於主碼的排序字段上。以Mysql的MyIsam存儲引擎為例:
輔助索引
定義:定義在主文件的任意一個或者多個非排序字段上的輔助存儲結構。輔助索引通常對字段(該字段非排序)的每一個不同值有一個索引項。
字段值不唯一,引入中間桶保存指針列表。如下:
差別
-
一個主文件僅有一個主索引,但可以有多個輔助索引;
-
主索引通常建立在主碼/排序碼上面;
-
可以利用主索引重新組織主文件數據,輔助索引不可以。
稠密索引 & 稀疏索引
稠密(Dense)索引
在稠密索引中,文件中的每個搜索碼值都對應一個索引值。也就是說,稠密索引為數據記錄文件的每一條記錄都設一個鍵-指針對。
稀疏(Sparse)索引
在稀疏索引中,只為搜索碼的某些值建立索引項。也就是說,稀疏索引為數據記錄文件的每個存儲塊設一個鍵-指針對,存儲塊意味着塊內存儲單元連續。
差別
- 稠密索引比稀疏索引更快的定位一條記錄。
- 稀疏索引所占空間小,插入和刪除時所需維護的開銷也小。
分析
從上述定義可以發現:
- 輔助索引最末層通常為稀疏索引
- 主索引可以是稠密索引+稀疏索引
為什么輔助索引最末層通常為稠密索引
因為數據文件是按照主索引進行排序的,輔助索引若為一個其他key,索引是根據這個key排序的,而相應的對應到數據文件則不一定是有序的,如下圖:
稠密索引是將索引的關鍵字key和數據所在位置一一對應起來,而稀疏索引因為數據文件和key對應有序而可以實現1:n的效果;顯然,使用輔助索引,最末層與數據文件不一定能對上順序,故輔助索引只可能為稠密索引。
輔助索引的設計策略
根據輔助索引的key進行排序,最末層采取稠密索引,前面采取稀疏索引。
重復key的處理:
- 重復
- 變長記錄
- 中間桶保存指針列表