继之前关于这个话题的问题,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索引的最佳结果,但我会尝试索引和索引列顺序的几种不同的组合来查看.
原文地址:https://www.jb51.cc/postgresql/191729.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。