继之前关于这个话题的问题,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);
要么
CREATE INDEX ix_coords_user_id ON updates (coords,user_id);
我正在阅读BTree表现比GIST好,但是我被迫使用GIST,因为我正在使用postgis地理领域?
如果要使用常规b-tree索引以外的任何索引方法(或散列索引,但不应真正使用它们),则必须使用GiST. PostGIS索引需要GiST.
B树索引只能用于涉及相等或排序的基本操作,例如=,< =,>> =,<>,BETWEEN和IN.虽然您可以在geomtery对象(点,区域等)上创建一个b-tree索引,但它实际上只能用作等效的排序比较,如>对于这些物体通常是无意义的.需要GiST索引来支持诸如“包含”,“相交”等的更复杂和一般的比较.
您可以使用btree_gist
extension为GiST启用b-tree索引.它比常规的b-tree索引要慢很多,但是您可以创建一个多列索引,其中包含仅限于GiST的类型和常规类型,如文本,整数等.
在这些情况下,您真的需要使用explain analysis(explain.depesz.com对此有用)来检查Pg如何使用您创建的各种索引和索引的组合.在多列索引中尝试不同的列排序,并查看两个或多个单独的索引是否更有效.
我强烈怀疑在这种情况下,您将获得多列GiST索引的最佳结果,但我会尝试索引和索引列顺序的几种不同的组合来查看.