根据我上一个关于这个主题的问题,Postgres combining multiple Indexes:
我在Postgres9.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好,但我是不是因为使用postgis地理字段而被迫使用GIST??
最佳答案
如果要使用除常规b树索引(或哈希索引)以外的任何索引方法,则必须使用GiST。PostGIS索引需要依据。
B树索引只能用于涉及等式或排序的基本操作,如=
、<
、<=
、>
、>=
、<>
、BETWEEN
、IN
、>
和btree_gist
。虽然可以在geometry对象(点、区域等)上创建b树索引,但实际上它只能用于等式,因为排序比较(如text
对于此类对象通常没有意义)。需要一个GiST索引来支持更复杂和更一般的比较,如“包含”、“相交”等。
您可以使用integer
extension为GIST启用B-树索引。它比常规的b-tree索引慢得多,但允许您创建一个多列索引,该索引既包含纯GiST类型,也包含常规类型,如explain analyze
,,等等。
在这些情况下,您确实需要使用(explain.depesz.com对此很有用)来检查Pg如何使用您创建的各种索引和索引组合。在多列索引中尝试不同的列顺序,看看两个或多个单独的索引是否更有效。
我强烈怀疑在这种情况下,使用多列GiST索引会得到最好的结果,但是我将尝试几种不同的索引组合和索引列顺序。
关于postgresql - Postgres GIST vs Btree指数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12738997/