Postgres的GIST VS B树索引(Postgres GIST vs Btree index

2019-08-01 04:41发布

从我刚才的问题在这个题目上之后, 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或B树?

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

要么

CREATE INDEX ix_coords_user_id ON updates (coords, user_id);

我读的是B树的性能比GIST好,但我会强迫,因为我使用的PostGIS地理野外使用GIST?

Answer 1:

如果你想使用比常规B树索引以外的任何索引方法必须使用GiST的(或散列索引,但他们真的不应该被使用)。 PostGIS的指标要求的依据。

B树索引只能用于涉及平等或排序,如基本操作=<<= >>=<> BETWEENIN 。 尽管可以创建一个对象geomtery(点,区域等)上的B树索引它只能被实际用于平等作为订货等的比较>通常都是没有意义为这样的对象。 要旨索引需要支持更复杂的和一般性的比较,如“包含”,“交叉”,等

您可以使用btree_gist扩展 ,使B-tree索引依据。 它比常规的B树索引要慢得多,但允许您创建包含仅GiST的类型和常规类型,如多列索引textinteger ,等等。


在这种情况下,你真的需要使用explain analyze ( explain.depesz.com是这个有用的)检查PG如何使用各种指标和创建的索引的组合。 尝试在多列索引不同的列排序,看看两个或两个以上单独的索引是否更有效。

我强烈怀疑,你会得到在这种情况下,多列索引的GiST最好的结果,但我想尝试索引和索引列排序的几种不同的组合,看看。



文章来源: Postgres GIST vs Btree index