微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Postgres GIST和Btree索引

继之前关于这个话题的问题,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 举报,一经查实,本站将立刻删除。

相关推荐