使用索引增加PostgreSQL查询性能

时间:2012-12-09 19:30:15

标签: sql performance postgresql indexing

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

SELECT DISTINCT client_id FROM orders WHERE orders.total>100

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

我可以从列“total”中添加索引吗?我不介意插入速度,我只需要查询运行速度非常快。

3 个答案:

答案 0 :(得分:4)

我希望以下multicolumn index最快:

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

PostgreSQL 9.2可能会受益更多。使用它的“仅索引元组”功能,它可以在有利的情况下服务查询而无需访问表:自上一个VACUUM以来没有写入。

在这种情况下,

DESCASC几乎不重要。可以在两个方向上搜索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>