继我之前关于此主题的问题Postgres combining multiple Indexes:
之后我在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);
OR
CREATE INDEX ix_coords_user_id ON updates (coords, user_id);
我读到BTree的表现比GIST好,但是因为我使用postgis地理字段而被迫使用GIST?
答案 0 :(得分:12)
如果要使用除常规b树索引(或哈希索引之外的任何索引方法,但不应该使用它们),则必须使用GiST。 PostGIS索引需要GiST。
B树索引只能用于涉及相等或排序的基本操作,如=
,<
,<=
,>
,>=
, <>
,BETWEEN
和IN
。虽然您可以在地理对象(点,区域等)上创建b树索引,但它实际上只能用于相等,因为像>
这样的排序比较通常对这些对象毫无意义。需要GiST索引来支持更复杂和一般的比较,如“包含”,“相交”等。
您可以使用btree_gist
extension为GiST启用b-tree索引。它比常规b树索引慢得多,但允许您创建一个多列索引,其中既包含GiST类型,也包含常规类型,如text
,integer
等。
在这些情况下,您确实需要使用explain analyze
(explain.depesz.com对此有用)来检查Pg如何使用您创建的各种索引和索引组合。在多列索引中尝试不同的列顺序,并查看两个或更多单独的索引是否更有效。
我强烈怀疑在这种情况下你会用多列GiST索引获得最佳结果,但我会尝试几种不同的索引和索引列排序组合来查看。