Postgresql 如何在Postgres中索引表以加快排序速度

Postgresql 如何在Postgres中索引表以加快排序速度,postgresql,postgresql-11,Postgresql,Postgresql 11,如何在PostgreSQL 11中创建索引以加速包含ORDER BY的特定查询 我有一个查询,需要从包含2M条记录的表中获取前100条记录,以及一些常见的过滤器,如: SELECT id, first_name, last_name FROM users WHERE active = true AND region IN (1,2,3) ORDER BY last_active_timestamp DESC; 如果没有ORDERBY子句,它将在约1秒内几乎立即返回。然而,有了这一条款,它需要花

如何在PostgreSQL 11中创建索引以加速包含ORDER BY的特定查询

我有一个查询,需要从包含2M条记录的表中获取前100条记录,以及一些常见的过滤器,如:

SELECT id, first_name, last_name
FROM users
WHERE active = true AND region IN (1,2,3)
ORDER BY last_active_timestamp DESC;
如果没有ORDERBY子句,它将在约1秒内几乎立即返回。然而,有了这一条款,它需要花费约5分钟的时间

因此,我尝试创建一个部分索引,如:

CREATE INDEX CONCURRENTLY my_user_index ON users (active, region, last_active_timestamp DESC NULLS LAST)
WHERE region IN (1, 2, 3) AND active = True;

但这几乎没有任何效果。上面的查询仍然需要几分钟。这只是Postgres中ORDER BY的一个限制,还是我可以使用不同类型的索引来加速它?

为了在查询中使用ORDER BY索引,您需要在所有相关列的last_active_timestamp上建立索引,以及只包含active==true和区域a、b、c的条件。这将基本上为您提取数据

此外,如果共享EXPLAIN ANALYZE输出,您可能会看到一种排序方法:external merge Disk:kB,这表明排序溢出到磁盘,而不是内存中,这是因为work_mem的大小不足。然后,解决方案是将work_mem增加到至少kB的值,然后重试

请注意,您可以在每个会话的基础上设置work_mem,因为work_mem的全局更改可能会产生负面影响,例如内存不足,因为postgresql.conf-configured work_mem是为每个会话分配的,基本上,它具有倍增效应


如果查询在优化work\u mem后仍然很慢,即它在内存中进行排序,并且仍然很慢,则返回的数据集太大,无法快速排序。

尝试索引是正确的,但使用了错误的索引。在这里试试这个:

同时创建索引我的用户索引 用户上一次\u活动\u时间戳描述 其中区域在1,2,3 和active=true; 您的索引在已按活动和区域排序后,仅按最后一个活动时间戳排序,因此您不能仅使用该索引对输出进行排序


为了提高速度,还可以使用include id、first\u name、last\u name在索引中包含select子句的列。现在,如果计划员选择这样做,您的查询就可以运行了,我认为它将只在索引上运行,而根本不涉及表数据。

是否可以包含解释?尝试创建索引时,索引上只包含最后一个活动的时间戳列。region和active在where子句上维护您是否尝试了一个只与ORDER BY子句相关的更简单的索引?类似于并发创建索引my_user_INDEX ON users last_active_timestamp DESC NULLS last。查询中的前100个在哪里?排序可以从索引中获得,因为它们的排序至少是标准的B树。但是使用的列确实避免使用索引。