B-Tree和GiST索引方法之间有什么区别(在PostgreSQL中)?

Ash*_*Ash 17 postgresql indexing b-tree gist-index

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

但是,我不能看出它们之间的实际区别是什么.我希望我的同事们能够解释一下,他们之间的利弊是什么,更重要的是,我之所以使用其中一个的原因是什么?

kqu*_*inn 23

简而言之:B-Tree索引表现更好,但GiST索引更灵活.通常,如果B-Tree索引适用于您的数据类型,则需要它们.PG名单上最近有一篇关于使用GiST索引的巨大性能损失的帖子; 他们预计将比B-树要慢一些(例如是灵活的价格),但不能慢得多......工作,正如你所预料的,持续的.

来自PostgreSQL核心开发人员Tom Lane的帖子:

GIST的要点是能够索引在btree中不可索引的查询....人们完全希望btree能够击败BIST可转换的btree案例.我认为这里重要的一点是,它赢了几百倍; 这非常糟糕,可能会指出一些实施问题.


小智 5

基本上每个人都是对的 - btree是默认索引,因为它表现得非常好.GiST是一些不同的野兽 - 它更像是一个"编写索引类型的框架",而不是一个索引类型.您必须添加自定义代码(在服务器中)才能使用它,但另一方面 - 它们非常灵活.

通常 - 除非您使用的数据类型告诉您这样做,否则不使用GiST.使用GiST的数据类型示例:ltree(来自contrib),tsvector(contrib/tsearch至8.2,自8.3以来的核心)以及其他数据类型.

PostgreSQL有着众所周知且非常快速的地理扩展 - PostGIS(http://postgis.refractions.net/),它将GiST用于其目的.