我最近一直致力于优化我的 Postgres 数据库,传统上我只使用 B 树索引。但是,我在 Postgres 8.3 文档中看到 GiST 索引支持非唯一的多列索引。

然而,我看不出它们之间的实际区别是什么。我希望我的程序员同事能够解释它们之间的优缺点,更重要的是,我为什么要使用其中一种而不是另一种的原因?

有帮助吗?

解决方案

在一个概括地说:B树索引表现得更好,但GiST索引更加灵活。通常情况下,你想B树索引它们是否会为您的数据类型。有一个最近的文章对PG列出有关一个巨大的性能损失,使用GiST索引;他们预计会比B-树(例如是灵活的价格)慢一些,但不是的的慢得多......工作,正如你所预料的,持续的。

后由汤姆巷时,芯的PostgreSQL显影剂:

  

GIST的主要的一点是要能够索引的查询,仅仅是   在B树不转位。 ...一会充分   预计B树击败了GIST的二叉树的可转位情况。我觉得   这里显著的一点是,它是由一对夫妇的制胜因素   百;这是相当可怕的,并可能指向一些实施   问题

其他提示

基本上每个人的右 - B树是默认的索引,因为它有很好的表现。 GiST的有些不同的野兽 - 它更多的是“框架编写索引类型”不是本身就是一个索引类型。你必须添加自定义代码(服务器)来使用它,但另一方面 - 他们是非常灵活的。

一般 - 你不要,除非你正在使用的数据类型告诉你这样做的使用要点。使用的GiST数据类型的例子:ltree(来自的contrib)的tsvector(的contrib / TSEARCH直到8.2,在芯自8.3),以及其他

有是众所周知的,并且非常快地理extenstion到PostgreSQL - PostGIS的( http://postgis.refractions.net/ ),其使用的GiST为其目的。

GiST 索引在一定程度上是有损的,这意味着 DBMS 必须处理误报/漏报,即:

GIST索引是有损的,因为每个文档在索引中由固定长度签名表示。签名是通过将每个单词放入n位字符串中的一个随机位来生成的,所有这些位均在一起以产生n位文档签名。当两个单词到相同的位置时,会有一个错误的匹配。如果查询中的所有单词都有匹配(真实或错误),则必须检索表行以查看匹配项是否正确。b 树没有这种行为,因此根据索引的数据,两者之间可能存在一些性能差异。

请参阅 文​​本搜索行为 http://www.postgresql.org/docs/8.3/static/textsearch-indexes.htmlhttp://www.postgresql.org/docs/8.3/static/indexes-types.html 用于通用比较。

GiST的是更一般的索引。您可以使用它们的是,那些你将与B树使用更广泛的用途。包括建立一个B树使用要旨能力。

IE:您可以使用GiST的索引地理点,或地理区域,是你将无法与B树索引做,因为这在B树关系的唯一的事情是关键(或键)您已索引上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top