按平均评级排序 - 如何加快速度?

时间:2015-02-23 09:19:47

标签: sql postgresql indexing sql-order-by postgresql-9.3

我在表格中有两列:

rating_total integer
rating_count integer

rating_total是总费率的总和,评分计数是总评分的数量。我想按平均价格订购:

ORDER BY (rating_total/rating_count) DESC, id ASC

我应该为average_rate创建单独的列吗?或者可以创建一些索引来加快速度?


我设法创建了这样的索引:

CREATE INDEX "posts-avg-rating-index" 
ON "Posts" (("rating_total"::float/(CASE "rating_count" WHEN 0 THEN NULL ELSE "rating_count" END)) DESC NULLS LAST, id DESC);'

这适用于这样的订购:

ORDER BY (("rating_total"::float/(CASE "rating_count" WHEN 0 THEN NULL ELSE "rating_count" END)) DESC NULLS LAST, id DESC)

1 个答案:

答案 0 :(得分:2)

你的问题造成了一些混乱,因为平均评分为"通常是在多行之间计算的值,无法对其进行索引。

在您的情况下,您显然希望按相同行中的两列商来订购,这恰好是"总计"和"计数"。在这种情况下,您可以拥有expression index,当然 - 您已经找到了一个。

您可以使用NULLIF进行简化:

CREATE INDEX posts_avg_rating_index
ON "Posts" (cast(rating_total AS float)/NULLIF(rating_count, 0) DESC NULLS LAST, id DESC);

在查询中使用相同的表达式。

关于cast()简写语法name::type和表达式索引:

而是使用合法的名称。标识符中的破折号(-)在双引号时是合法的,但只是要求麻烦。