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