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索引的最佳结果,但我会尝试索引和索引列顺序的几种不同的组合来查看.

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...