我在 Postgres 数据库上有一个 Rails 应用程序,它严重依赖于这样的查询:
SELECT DISTINCT client_id FROM orders WHERE orders.total>100
本质上,我需要所有具有满足特定条件的订单的客户的 ID。我只需要 id,所以我认为这比使用连接要快得多。
我会从向“总计”列添加索引中受益吗?我不介意插入速度,我只需要查询运行得非常快。
我在 Postgres 数据库上有一个 Rails 应用程序,它严重依赖于这样的查询:
SELECT DISTINCT client_id FROM orders WHERE orders.total>100
本质上,我需要所有具有满足特定条件的订单的客户的 ID。我只需要 id,所以我认为这比使用连接要快得多。
我会从向“总计”列添加索引中受益吗?我不介意插入速度,我只需要查询运行得非常快。
我希望以下多列索引最快:
CREATE INDEX orders_foo_idx ON orders (total DESC, client_id);
PostgreSQL 9.2 可能会受益更多。凭借它的“仅索引元组”功能,它可以在有利的情况下为查询提供服务,而无需命中表:自上次以来没有写入VACUUM
。
DESC
或者ASC
在这种情况下几乎不重要。可以在两个方向上几乎同样有效地搜索 B 树索引。
绝对地。由于总列上没有索引,此查询将需要表扫描。对于总列上的索引,它将需要索引查找和键查找。随着表大小的增长,这将为您的查询提供巨大的性能提升。
> 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 列上创建称为覆盖索引的内容,因此数据库引擎不必在后台查找行来获取您的数据。