我是否正确理解索引?

Den*_*rov 7 postgresql index performance-tuning

我正在努力解决各种数据库索引之间的差异。我为自己创建了一个小例子,我不知道我是否正确理解了所有内容。

假设我们有一个这样的虚构数据库表:

addr col1  col2
===============
1    a     b
2    c     b
3    a     c
4    d     d
5    c     a
6    a     b
7    c     b
8    d     d
9    a     c
Run Code Online (Sandbox Code Playgroud)

addr这是相应元组的物理位置。这是我对单列、多列和覆盖索引的外观的理解(不是物理上的,而是概念上的):

create index on col1
a - 1, 3, 6, 9
c - 2, 5, 7
d - 4, 8

create index on (col1, col2)
a b - 1, 6
a c - 3, 9
c a - 5
c b - 2, 7
d d - 4, 8

create index on col1 include col2
a - 1b, 3c, 6b, 9c
c - 2b, 5a, 7b
d - 4d, 8d
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:我做对了吗?

J.D*_*.D. 6

您说得非常正确,但这并不是概念化它的最佳方式,而是您应该绘制一棵树,因为这是通常用于将数据保存在索引中的逻辑数据结构。

使用您的符号,您的第一个示例和第三个示例有点难以区分用于引用实际行的键/行 ID 和包含的字段是什么(但我理解您的意思,鉴于您的架构细节)。

这是一篇关于索引和 B 树的好文章,其中有一个很好的示例,说明了如何对其进行概念化。(您可以忽略特定于数据库系统的注释,例如 SQLite 部分,因为本文中的一般适用于几乎所有现代关系数据库管理系统。)此外,您可以使用这个B-Tree 模拟器来帮助您进行可视化它们如何随着数据添加到索引表而增长。