索引充当数据库中的辅助结构,有两个主要目的:增强数据检索速度和执行完整性规则。让我们详细浏览PostgreSQL中的索引,查看可用的不同类型的索引,解释为什么存在如此多样性,并查看如何利用它们来优化查询性能。
索引类型
从9.6版本开始,PostgreSQL提供了六种内置类型的索引。所有索引类型将特定键与包含该密钥的相应表行关联。每行均由元组ID(TID)唯一识别,该元组包括文件中的块号和该块中的行位置。
在索引数据上执行的任何操作,例如插入,删除或更新表行,都必须在同一交易中更新该特定表的索引。
索引的可扩展性
PostgreSQL已在其一般索引引擎中实现了一个接口,以方便在系统中添加新的访问方法。该接口的主要目的是从访问方法中获取元组ID(TID)并执行一些任务。它读取来自表行的适当版本的数据,并使用单个tids或使用预构建的位图在批处理中检索行版本。它确定了当前交易的行版本的可见性,考虑到其隔离水平。
索引引擎参与查询执行,并根据优化阶段生成的计划调用。优化器考虑了所有潜在访问方法的功能,评估了执行查询的各种方法。
使用索引引擎,PostgreSQL确保在考虑其特定特征的同时,确保对不同访问方法的统一处理。主要的扫描技术是索引扫描和位图扫描。在索引扫描中,将TID值顺序返回,直到达到最后一个匹配行,并且索引引擎访问这些TID指示的表行。另一方面,在一个位图扫描中,所有与条件匹配的TID均可返回,并且在从表中读取相应的行版本之前,基于这些TID构建了行版本的位图。这些扫描技术之间的选择取决于诸如检索行的数量之类的因素,并由优化器确定。