19

继我之前关于这个主题的问题之后,Postgres 结合了多个索引

我在 Postgres 9.2(带有 postgis)上有下表:

CREATE TABLE updates (
    update_id character varying(50) NOT NULL,
    coords geography(Point,4326) NOT NULL,
    user_id character varying(50) NOT NULL,
    created_at timestamp without time zone NOT NULL
);

我正在表上运行以下查询:

select * 
from updates 
where ST_DWithin(coords, ST_MakePoint(-126.4, 45.32)::geography, 30000) 
and user_id='3212312' 
order by created_at desc
limit 60

因此,鉴于此,我应该为(coords + user_id)、GIST 还是 BTree 使用什么索引?

CREATE INDEX ix_coords_user_id ON updates USING GIST (coords, user_id);

或者

CREATE INDEX ix_coords_user_id ON updates (coords, user_id);

我读到 BTree 的性能比 GIST 好,但我是否被迫使用 GIST,因为我使用的是 postgis 地理字段?

4

1 回答 1

17

如果您想使用除常规 b-tree 索引(或哈希索引,但实际上不应使用)之外的任何索引方法,则必须使用 GiST。PostGIS 索引需要 GiST。

B-tree 索引只能用于涉及相等或排序的基本操作,例如=<<=>>=<>和。虽然您可以在几何对象(点、区域等)上创建 b-tree 索引,但它实际上只能用于相等,因为排序比较对于此类对象通常没有意义。需要一个 GiST 索引来支持更复杂和更一般的比较,如“包含”、“相交”等。BETWEENIN>

您可以使用该btree_gist扩展为 GiST 启用 b-tree 索引。它比常规的 b-tree 索引要慢得多,但允许您创建一个多列索引,其中包含仅 GiST 类型和常规类型,如text,integer等。


在这些情况下,您确实需要使用explain analyzeexplain.depesz.com对此很有用)来检查 Pg 如何使用您创建的各种索引和索引组合。在多列索引中尝试不同的列排序,看看两个或多个单独的索引是否更有效。

我强烈怀疑在这种情况下,您将使用多列 GiST 索引获得最佳结果,但我会尝试几种不同的索引和索引列排序组合来查看。

于 2012-10-05T03:20:45.850 回答