这是一个非常经典的基础理论题,考察的是数据库索引(特别是**稠密索引与稀疏索引**、**聚集索引与辅助索引**)的核心概念。
首先直接给出结论:**B 选项是错误的**。评论里说四个都对,可能是因为对“稀疏”和“稠密”在特定实现下的理解有偏差,但在标准的数据库教材(如《数据库系统概念》——黑皮书)理论中,B 绝对是错的。
1. 核心概念辨析
稠密索引 (Dense Index)**:文件中的**每一个**搜索码值在索引中都有一个索引项。
稀疏索引 (Sparse Index)**:只为搜索码的**部分**值建立索引项。只有当数据文件是按搜索码**物理排序**(即聚集索引)时,稀疏索引才能工作。
* **辅助索引 (Secondary Index)**:也叫非聚集索引。数据文件本身的物理存储顺序与索引的搜索码顺序**不一致**。
2. 逐一分析选项
A. 如果一条关系可以有不止一条包含相同搜索码值的记录,则该搜索码称为非唯一性搜索码。
* **解释**:这是基本定义。如果一个字段(搜索码)允许重复值(比如“年龄”字段,很多人都是20岁),那它就是非唯一性的。
* **结论**:正确。
B. 辅助索引通常是稀疏的以节省空间,并且每个搜索码值在索引中严格对应唯一一个索引项。(错误项)
错误点1:辅助索引必须是“稠密”的,不能是“稀疏”的。**
原因**:稀疏索引的工作前提是“数据有序”。如果索引里没记录某个值 $K$,你可以找比 $K$ 小的最大索引项,然后去磁盘顺序往后找。但**辅助索引对应的数据是乱序存放的**,如果你在索引里找不到值 $K$,你根本不知道它在磁盘的哪个角落。所以,辅助索引必须为每一个搜索码值都建立索引项。
错误点2:索引项的对应关系。
如果是非唯一性搜索码,一个搜索码值在索引中可能对应一个“指针桶”(一堆指针),而不是“严格对应唯一一个索引项”(除非这里的“索引项”包含了指针桶的概念,但结合前半句的“稀疏”,该选项明显是把辅助索引和聚集索引的概念记混了)。
结论:错误。
C. 辅助索引只存储部分搜索码值,则具有中间搜索码值的记录可能存在于文件中的任何位置。
解释:这句话其实是在**解释为什么辅助索引不能是稀疏的**。如果(假设)辅助索引只存了部分值(稀疏了),因为数据是无序的,那么那些没被索引记录的“中间值”可能散落在磁盘的任何地方,导致无法通过顺序扫描找到。
结论**:正确(它描述了一种“如果成立则会导致混乱”的逻辑后果)。
D. 非唯一性搜索码上的辅助索引中的指针不会直接指向记录。
解释**:如果搜索码不唯一(比如搜“张三”,有10个张三),索引项通常不会直接指向量记录,而是指向一个**指针桶 (Bucket)**,桶里才存放着指向那10条记录的物理地址。或者像 MySQL InnoDB 那样,辅助索引指向的是主键值(间接指向)。
结论:正确。
3. 为什么有人会说“四个都对”?(深度解析误区)
评论区的争论通常来自于**理论模型**与**具体实现(B+树)**的混淆:
1. **关于稀疏性**:在 B+ 树索引中,**非叶子节点**确实是“稀疏”的(它们只存部分键作为路标)。但当我们讨论“辅助索引是稠密还是稀疏”时,指的是**叶子节点层**。在叶子节点层,辅助索引必须包含所有数据行的信息(或所有不同的键值),因此在逻辑上它被归类为**稠密索引**。
2. **关于 B 选项的后半句**:有人认为“每个键值对应一个索引项”是对的。但在标准考试中,B 选项前半句关于“辅助索引通常是稀疏的”这句断言是考点的重灾区,是经典的错误表述。
总结
这道题考的是:**辅助索引(Secondary Index)由于数据物理无序,必须是稠密(Dense)索引。
* **聚集索引**:可以是稠密的,也可以是稀疏的。
* **辅助索引**:必须是稠密的。
**所以 B 选项说“辅助索引通常是稀疏的”是明显的概念性错误。**