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


11

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

  • price (十进制)
  • product_id (整数)

也有created_atupdated_at列。

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

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

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

4
在条件下使用部分索引where active可能会更有助于检索最新产品。
a_horse_with_no_name

Answers:


11

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

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

select *
from Prices
where product_id = ?
order by updated_at desc 
limit 1

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


1
此查询需要有效的索引(product_id, updated_at)-或上 的索引(product_id, updated_at DESC)。不只是在 (updated_at)
ypercubeᵀᴹ

5

在不了解数据库其余部分的情况下,您可能会提供一些非正规形式来加快产品价格的获取(假设每个商品都有一个价格)。

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

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


-1

您应该在价格表中有一列日期和时间(从生效)。用户将在更新价格时输入其值。之后,仅获取desc wef限制为1的值。


这不能回答问题。
Colin't Hart
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.