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

Ordering by average rating - how to speed it up?

我在 table 中有两列:

rating_total integer
rating_count integer

rating_total是总评分的总和,rating count是总评分的个数。我想按平均汇率订购:

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)

您的问题造成了一些混乱,因为 "average rating" 通常是跨 多行 计算的值,无法编制索引。

在您的情况下,您显然希望按 相同行 中两列的商来排序,这恰好是 "total" 和 "count".对于这种情况,你当然可以有一个 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() shorthand 语法 name::type 和表达式索引:

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

  • Are PostgreSQL column names case-sensitive?