主索引/輔助索引/稠密索引/稀疏索引


主索引 & 輔助索引

主索引

定義:將主文件分塊,每一塊對應一個索引項。每個存儲快的第一條記錄,又稱為錨記錄。主索引是按照索引字段值進行排序的一個有序文件,通常建立在有序文件的基於主碼的排序字段上。以Mysql的MyIsam存儲引擎為例:

img

輔助索引

定義:定義在主文件的任意一個或者多個非排序字段上的輔助存儲結構。輔助索引通常對字段(該字段非排序)的每一個不同值有一個索引項。

img

字段值不唯一,引入中間桶保存指針列表。如下:

070119_0833_IndexinginD4

差別

  1. 一個主文件僅有一個主索引,但可以有多個輔助索引;

  2. 主索引通常建立在主碼/排序碼上面;

  3. 可以利用主索引重新組織主文件數據,輔助索引不可以。

稠密索引 & 稀疏索引

稠密(Dense)索引

在稠密索引中,文件中的每個搜索碼值都對應一個索引值。也就是說,稠密索引為數據記錄文件的每一條記錄都設一個鍵-指針對。

070119_0833_IndexinginD2

稀疏(Sparse)索引

在稀疏索引中,只為搜索碼的某些值建立索引項。也就是說,稀疏索引為數據記錄文件的每個存儲塊設一個鍵-指針對,存儲塊意味着塊內存儲單元連續。

070119_0833_IndexinginD3

差別

  1. 稠密索引比稀疏索引更快的定位一條記錄。
  2. 稀疏索引所占空間小,插入和刪除時所需維護的開銷也小。

分析

從上述定義可以發現:

  1. 輔助索引最末層通常為稀疏索引
  2. 主索引可以是稠密索引+稀疏索引

為什么輔助索引最末層通常為稠密索引

因為數據文件是按照主索引進行排序的,輔助索引若為一個其他key,索引是根據這個key排序的,而相應的對應到數據文件則不一定是有序的,如下圖:

secondary-sparse-no-sense

稠密索引是將索引的關鍵字key和數據所在位置一一對應起來,而稀疏索引因為數據文件和key對應有序而可以實現1:n的效果;顯然,使用輔助索引,最末層與數據文件不一定能對上順序,故輔助索引只可能為稠密索引。

輔助索引的設計策略

根據輔助索引的key進行排序,最末層采取稠密索引,前面采取稀疏索引。

secondary-dense-sparse

重復key的處理:

  1. 重復

secondary-dense-dups-1

  1. 變長記錄

secondary-dense-dups-2

  1. 中間桶保存指針列表

secondary-level-of-ind

reference

[1] https://www.guru99.com/indexing-in-database.html

[2] http://mlwiki.org/index.php/Secondary_Index


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM