# 67.4.实施

67.4.1. 快速更新技术

67.4.2. 部分匹配算法

在内部,GIN索引包含在键上构造的B树索引,其中每个键都是一个或多个索引项(例如,数组的一个成员)的元素,叶页中的每个元组都包含指向堆指针的B树的指针(“发布树”),或者一个简单的堆指针列表(“发布列表”),当列表足够小,可以与键值一起放入一个索引元组时。图67.1说明了GIN索引的这些组件。

从PostgreSQL 9.1开始,索引中可以包含空键值。此外,占位符null也包含在索引中,用于索引为null或不包含键的索引项提取值。这允许搜索应该查找空项目的内容。

多列GIN索引是通过在复合值(列号、键值)上构建单个B树来实现的。不同列的键值可以是不同的类型。

图67.1.杜松子酒

# 67.4.1.快速更新技术

由于反向索引的本质,更新GIN索引的速度往往很慢:插入或更新一个堆行可能会导致多次插入索引(从索引项中提取的每个键对应一个)。GIN可以通过将新元组插入到一个临时的、未排序的待处理项列表中来推迟大部分工作。当表格被抽真空或自动分析时,或者杜松子酒清洁待处理清单函数,或者如果挂起列表大于杜松子酒_悬而未决的_列表_限度,使用初始索引创建期间使用的相同批量插入技术将条目移动到主GIN数据结构。这大大提高了GIN索引的更新速度,甚至计算了额外的真空开销。此外,开销工作可以通过后台进程而不是前台查询处理来完成。

这种方法的主要缺点是,除了搜索常规索引外,搜索还必须扫描待处理项列表,因此大量待处理项列表将显著降低搜索速度。另一个缺点是,虽然大多数更新都很快,但导致挂起列表变得“太大”的更新会导致立即的清理周期,因此比其他更新慢得多。正确使用自动真空可以最大限度地减少这两个问题。

如果一致的响应时间比更新速度更重要,可以通过关闭快速更新GIN索引的存储参数。看见创建索引详细信息。

# 67.4.2.部分匹配算法

GIN可以支持“部分匹配”查询,在这种查询中,查询不会确定一个或多个键的精确匹配,但可能的匹配属于合理狭窄的键值范围(在比较支持方法)。这个提取查询方法,而不是返回要精确匹配的键值,而是返回一个键值,该键值是要搜索的范围的下限,并设置P匹配这是真的。然后使用比较部分方法比较部分对于匹配的索引键,必须返回零;对于仍在要搜索的范围内的非匹配项,必须返回小于零;如果索引键超出了可以匹配的范围,则必须返回大于零。