从表中获取最后一行的最快方法是什么?

Mik*_*e81 13 postgresql physical-design

我有一个 PostgreSQL 表Prices,包含以下列:

  • price (十进制)
  • product_id (国际)

还有created_atupdated_at列。

价格会定期更新,我会在表中保留旧价格。对于给定的产品,表中的最后一个价格是当前价格。

获得特定产品最后价格的最有效方法是什么:

  • 索引product_id和查询最后一条记录
  • 添加第三列active(布尔值)以标记最新价格并创建复合索引(product_idactive
  • 或者是其他东西?

ETL*_*ETL 13

无论解决方案如何,您都需要在 product_id 上建立索引。

如果您在 updated_at 列上有一个索引,并且您所需要的只是如您所说的那样获取“特定产品”,那么我会这样做:

select *
from Prices
where product_id = ?
order by updated_at desc 
limit 1
Run Code Online (Sandbox Code Playgroud)

但是如果我没有得到我想要的结果,或者如果我需要获得许多产品的当前价格,那么我会尝试添加一个活动列的选项,并在执行时将其设置为 N 以获取除新价格以外的所有价格价格的更新,然后我将创建一个部分索引,其中按照 a_horse_with_no_name 的建议处于活动状态。我只会在需要时去那里,因为它增加了更新先前价格行使其不活跃等的复杂性。


gre*_*reg 5

如果不了解数据库的其余部分,您可以负担一些非正常形式来加快产品价格获取(假设每个项目都有一个价格)。

只要创建一个名为新列last_pricepriceproduct表创建触发器AFTER INSERT ON EACH ROW在你的price桌子。每次创建新价格时,它都会使用最新价格更新相关产品。这样,每次您获取产品时,您也获取它的最后价格。

从 9.3 版本开始,PostgreSQL 支持物化视图。这是一种对数据进行非规范化的好方法,保持正常的写入形式和非规范化的读取视图。视图的更新可以由 Postgres 的 LISTEN/NOTIFY 机制触发。