mirror of
https://github.com/Vonng/ddia.git
synced 2025-01-05 15:30:06 +08:00
关键值索引 -> 键值索引(key-value indexes)
This commit is contained in:
parent
14258c9138
commit
3a9b4bd691
3
ch3.md
3
ch3.md
@ -297,7 +297,7 @@ B树在数据库体系结构中是非常根深蒂固的,为许多工作负载
|
||||
|
||||
### 其他索引结构
|
||||
|
||||
到目前为止,我们只讨论了关键值索引,它们就像关系模型中的**主键(primary key)** 索引。主键唯一标识关系表中的一行,或文档数据库中的一个文档或图形数据库中的一个顶点。数据库中的其他记录可以通过其主键(或ID)引用该行/文档/顶点,并且索引用于解析这样的引用。
|
||||
到目前为止,我们只讨论了键值索引,它们就像关系模型中的**主键(primary key)** 索引。主键唯一标识关系表中的一行,或文档数据库中的一个文档或图形数据库中的一个顶点。数据库中的其他记录可以通过其主键(或ID)引用该行/文档/顶点,并且索引用于解析这样的引用。
|
||||
|
||||
有二级索引也很常见。在关系数据库中,您可以使用 `CREATE INDEX` 命令在同一个表上创建多个二级索引,而且这些索引通常对于有效地执行联接而言至关重要。例如,在[第二章](ch2.md)中的[图2-1](img/fig2-1.png)中,很可能在 `user_id` 列上有一个二级索引,以便您可以在每个表中找到属于同一用户的所有行。
|
||||
|
||||
@ -306,6 +306,7 @@ B树在数据库体系结构中是非常根深蒂固的,为许多工作负载
|
||||
#### 将值存储在索引中
|
||||
|
||||
索引中的键是查询搜索的内容,而其值可以是以下两种情况之一:它可以是所讨论的实际行(文档,顶点),也可以是对存储在别处的行的引用。在后一种情况下,行被存储的地方被称为**堆文件(heap file)**,并且存储的数据没有特定的顺序(它可以是仅追加的,或者可以跟踪被删除的行以便用新数据覆盖它们后来)。堆文件方法很常见,因为它避免了在存在多个二级索引时复制数据:每个索引只引用堆文件中的一个位置,实际的数据保存在一个地方。
|
||||
|
||||
在不更改键的情况下更新值时,堆文件方法可以非常高效:只要新值的字节数不大于旧值,就可以覆盖该记录。如果新值更大,情况会更复杂,因为它可能需要移到堆中有足够空间的新位置。在这种情况下,要么所有的索引都需要更新,以指向记录的新堆位置,或者在旧堆位置留下一个转发指针【5】。
|
||||
|
||||
在某些情况下,从索引到堆文件的额外跳跃对读取来说性能损失太大,因此可能希望将索引行直接存储在索引中。这被称为聚集索引。例如,在MySQL的InnoDB存储引擎中,表的主键总是一个聚集索引,二级索引则引用主键(而不是堆文件中的位置)【31】。在SQL Server中,可以为每个表指定一个聚集索引【32】。
|
||||
|
Loading…
Reference in New Issue
Block a user