首页 > 解决方案 > 对每个 UserId 实施限制的最快方法

问题描述

我有一个有趣的问题,我想对用户可以放置多少优惠实施特定限制。报价保存在 postgresql(版本 10)数据库中,不应超过 1000。

我正在使用以下 sql 查询来检查用户有多少优惠,并对照限制进行检查:

select count(*) from offers where offers.userId = 'b27e1d2f-c2c1-4d0b-8451-287013d7b716';

在性能指标中,我看到大部分时间都花在了这个查询上。因此我查了一下发现:https ://wiki.postgresql.org/wiki/Slow_Counting

PostgreSQL 仍然需要读取结果行来验证它们是否存在;

在查询计划器中可以看出,除了索引之外,只需要扫描一些堆提取,我认为这会减慢整个查询的速度:

Index Only Scan using offers_by_user_id_index on offers
Index Cond: (account_id = 'b27e1d2f-c2c1-4d0b-8451-287013d7b716'::uuid) | Heap Fetches: 650

- 有什么方法可以加快速度?

跟踪行数是加快检查速度的好方法吗?

谢谢你的帮助!

编辑:UserId 是一个 UUID,并且 UUID 列上存在索引

标签: sqlpostgresqlperformance

解决方案


堆提取的数量表明该表没有足够频繁地被清理。如果您手动 VACUUM 它,这会加快速度吗?


推荐阅读