按平均评分排序 - 如何加快速度?
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?
我在 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?