1

我在 Postgres 数据库上有一个 Rails 应用程序,它严重依赖于这样的查询:

SELECT DISTINCT client_id FROM orders WHERE orders.total>100

本质上,我需要所有具有满足特定条件的订单的客户的 ID。我只需要 id,所以我认为这比使用连接要快得多。

我会从向“总计”列添加索引中受益吗?我不介意插入速度,我只需要查询运行得非常快。

4

3 回答 3

4

我希望以下多列索引最快:

CREATE INDEX orders_foo_idx ON orders (total DESC, client_id);

PostgreSQL 9.2 可能会受益更多。凭借它的“仅索引元组”功能,它可以在有利的情况下为查询提供服务,而无需命中表:自上次以来没有写入VACUUM

DESC或者ASC在这种情况下几乎不重要。可以在两个方向上几乎同样有效地搜索 B 树索引。

于 2012-12-09T19:44:24.873 回答
1

绝对地。由于总列上没有索引,此查询将需要表扫描。对于总列上的索引,它将需要索引查找和键查找。随着表大小的增长,这将为您的查询提供巨大的性能提升。

于 2012-12-09T19:41:28.700 回答
1
>  I only need the id, so I figured this is way faster than using joins.

是的,虽然我不确定为什么在这种情况下你会首先考虑使用连接。

正如 cmotley 所说,您将需要此查询的总列上的索引。但是,最佳性能将取决于您正在运行的查询例如,对于这个查询,使用这个表结构,最快的方法是创建一个索引,如下所示:

CREATE INDEX IX_OrderTotals ON orders (total, client_id)

通过将 client_id 包含在索引中,您可以在 client_id 列上创建称为覆盖索引的内容,因此数据库引擎不必在后台查找行来获取您的数据。

于 2012-12-09T19:46:46.977 回答