加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – Postgres GIST和Btree索引

发布时间:2020-12-13 16:32:36 所属栏目:百科 来源:网络整理
导读:继之前关于这个话题的问题,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,cre
继之前关于这个话题的问题,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索引的最佳结果,但我会尝试索引和索引列顺序的几种不同的组合来查看.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读