对 WHERE 和 ORDER BY 列使用 PostgreSQL 索引

问题描述 投票:0回答:1

对于以下查询,在我们有的情况下 < 25 records for the contracts 1, 2, 3, this query performs extremely slow:

SELECT *
    FROM transactions AS t
    WHERE t.contract_id in (1, 2, 3)
    ORDER BY t.transaction_time desc
    LIMIT 25 OFFSET 0

解释计划如下:

1) Index Scan using perf_transactions_transaction_time_desc on transactions t  
2) Filter: (contract_id = ANY ('{1,2,3}'::integer[]))

我们尝试了综合指数的两种变体:

CREATE INDEX perf_transactions_transaction_time_contract_desc ON transactions (contract_id, transaction_time desc);

并且

CREATE INDEX perf_transactions_transaction_time_contract_desc ON transactions (transaction_time desc, contract_id);

但是解释计划看起来还是一样。

当记录数小于 LIMIT 时,我们应该如何创建索引?

sql database postgresql query-optimization
1个回答
0
投票

复合索引中列的顺序很重要,尤其是当您的查询条件涉及过滤“WHERE”和排序“ORDER BY”时。

这个索引似乎有正确的顺序

CREATE INDEX perf_transactions_transaction_time_contract_desc ON transactions (contract_id, transaction_time desc);

有时,PostgreSQL 可能不会立即开始使用新索引。 运行

ANALYZE transactions;
更新规划器的统计数据:

© www.soinside.com 2019 - 2024. All rights reserved.