B-Tree 和 GiST 索引方法(在 PostgreSQL 中)有啥区别?
Posted
技术标签:
【中文标题】B-Tree 和 GiST 索引方法(在 PostgreSQL 中)有啥区别?【英文标题】:What's the difference between B-Tree and GiST index methods (in PostgreSQL)?B-Tree 和 GiST 索引方法(在 PostgreSQL 中)有什么区别? 【发布时间】:2010-10-20 11:18:17 【问题描述】:我最近一直致力于优化我的 Postgres 数据库,而传统上,我只使用过 B-Tree 索引。但是,我在 Postgres 8.3 文档中看到 GiST 索引支持非唯一的多列索引。
但是,我看不出它们之间的实际区别是什么。我希望我的程序员同事能解释一下,它们之间的优缺点是什么,更重要的是,我为什么会使用其中一个而不是另一个?
【问题讨论】:
【参考方案1】:基本上每个人都是正确的 - btree 是默认索引,因为它的性能非常好。 GiST 是一些不同的野兽——它更像是一个“编写索引类型的框架”,而不是一个索引类型。您必须添加自定义代码(在服务器中)才能使用它,但另一方面 - 它们非常灵活。
通常 - 除非您使用的数据类型告诉您这样做,否则您不会使用 GiST。使用 GiST 的数据类型示例:ltree(来自 contrib)、tsvector(contrib/tsearch 直到 8.2,核心自 8.3 起)等。
众所周知,PostgreSQL 的地理扩展速度非常快 - PostGIS (http://postgis.refractions.net/),它使用 GiST 来实现其目的。
【讨论】:
【参考方案2】:GiST 索引在一定程度上是有损的,这意味着 DBMS 必须处理误报/误报,即:
GiST 索引是有损的,因为每个文档在索引中都由一个固定的- 长度签名。签名是 通过将每个单词散列成一个 n位字符串中的随机位,与 所有这些位 OR-ed 在一起 产生一个 n 位的文档签名。 当两个单词哈希到同一个位时 位置会有错误的匹配。 如果查询中的所有单词都匹配 (真或假)然后是表格行 必须检索以查看是否匹配 是正确的。 b-trees 没有这种行为,因此根据被索引的数据,两者之间可能存在一些性能差异。
查看文本搜索行为 http://www.postgresql.org/docs/8.3/static/textsearch-indexes.html 和 http://www.postgresql.org/docs/8.3/static/indexes-types.html 进行通用比较。
【讨论】:
这句话出自哪里?我不相信 GIST 本质上是有损的,所以我猜这是针对特定类型的,可能是针对文本的。 它来自第一个链接中的 8.3 文档部分(在第二个查询计划下方)。这也反映在 9.5 的相应部分中。 是这样想的。这是特定于文本搜索实现的。 GiST 允许索引实现是有损的,但它们并非必须如此。【参考方案3】:简而言之:B-Tree 索引性能更好,但 GiST 索引更灵活。通常,如果 B-Tree 索引适用于您的数据类型,则需要它们。 PG 列表上最近有一篇关于使用 GiST 索引对性能造成巨大影响的帖子;预计它们会比 B-Trees 慢(这就是灵活性的代价),但不会那么慢很多......正如您所料,工作正在进行中。
来自a post by Tom Lane,PostgreSQL 核心开发人员:
GIST 的主要目的是能够索引简单的查询 在 btree 中不可索引。 ...一个人会完全 期望 btree 在 btree 可索引的情况下击败 GIST。我觉得 重要的一点是它以几倍的优势获胜 百;这太糟糕了,可能指向一些实现 问题。
【讨论】:
【参考方案4】:GiST 是更通用的索引。您可以将它们用于与 B-Tree 一起使用的更广泛的用途。包括使用 GiST 构建 B-Tree 的能力。
IE:您可以使用 GiST 对地理点或地理区域进行索引,这是 B-Tree 索引无法做到的,因为 B-Tree 上唯一重要的是键(或键)您正在索引。
【讨论】:
您能否更详细地解释一下 GiST 如何更好地适用于地理点或地理区域 - 因为这非常符合我使用索引的目的。以上是关于B-Tree 和 GiST 索引方法(在 PostgreSQL 中)有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章