postgresql - 如何在 Postgres 中索引表以加快 ORDER BY
问题描述
如何在 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;
如果没有该ORDER BY
子句,它会在大约 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;
但这几乎没有效果。上面的查询仍然需要几分钟。这只是ORDER BY
Postgres 的一个限制,还是我可以使用不同类型的索引来加速它?
解决方案
尝试索引是正确的,但您使用了错误的索引。在这里试试这个:
CREATE INDEX CONCURRENTLY my_user_index
ON users (last_active_timestamp DESC)
WHERE region IN (1, 2, 3)
AND active = true;
您的索引仅last_active_timestamp
在已经被排序之后才排序active
,region
因此您不能只使用索引来获得排序输出。
为了进一步加快速度,您还可以使用INCLUDE (id, first_name, last_name)
. 现在您的查询可以(如果计划者选择这样做并且我认为它会)仅在索引上运行,而根本不接触表数据。
推荐阅读
- python - 如何合并熊猫中的数据框,这些数据框有一些共同的列,一些没有丢失任何数据
- json - Jolt Transformation Spec 中的值相乘
- reactjs - 谷歌云平台监控和反应
- r - ggplot2: scales="free_y" 但保持 x 轴线
- c - malloc 的这个实现是一个凹凸分配器吗?
- scala - 无标记决赛中的 parSequence 和 parTraverse
- kotlin - readLine 用于可变数量的 Int
- python - 在 Python 中构建测试开发的最佳方式,以便可以使用模拟或不使用模拟来运行测试?
- python - 如果响应不是 json 格式,如何解析来自 python requests 方法的响应?
- python - Web 抓取表到 Pandas 数据框