Postgresql 如何在连接查询中快速获取数据?

Postgresql 如何在连接查询中快速获取数据?,postgresql,ruby-on-rails-4,Postgresql,Ruby On Rails 4,我有3个表用户、订单和评论每个表有1008725024949600和26532000多条记录,我进行此查询是为了统计每个订单上的评论,但执行此查询需要半个多小时,如何加快此查询速度。 注意:foreig_键列上已经有索引 select users.user_name, orders.id, count(comments.order_id) from orders inner join users on users.id=orders.user_id inner join comments

我有3个表用户、订单和评论每个表有1008725024949600和26532000多条记录,我进行此查询是为了统计每个订单上的评论,但执行此查询需要半个多小时,如何加快此查询速度。 注意:foreig_键列上已经有索引

select users.user_name, orders.id, count(comments.order_id)
  from orders
 inner join users on users.id=orders.user_id
 inner join comments on orders.id=comments.order_id
 group by comments.order_id, users.user_name, orders.id
 limit 2;

在聚合记录之前,可以尝试使用临时表。这可能有助于减少查询时间。像这样的

CREATE TEMPORARY TABLE temp_table(
...
);

INSERT INTO temp_table
SELECT users.user_name, orders.id, comments.order_id
FROM orders INNER JOIN users ON users.id = orders.user_id INNER JOIN comments ON orders.id = comments.order_id;

SELECT user_name, id, count(order_id) FROM temp_table group by order_id, user_name, id;

首先,可能您需要ORDERBY子句将其与LIMIT一起使用 如果您需要最多的注释对,您可以按计数说明订购

第二件事是comments.order\u id=orders.id。为什么两个都用在团体中

group by comments.order_id, users.user_name, orders.id
也许你能帮上这样的忙:

WITH grouped AS (
   SELECT order_id AS id, count(*)
     FROM comments
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 2
)
SELECT u.user_name, g.id, g.count
  FROM grouped AS g
  JOIN orders AS o ON
       o.id = g.id
  JOIN users AS u ON
       u.id = o.user_id

这样可以避免在筛选和分组之前联接所有表

我认为您需要减少订单和注释表之间不必要的联接。您只想从表注释中获得一个顺序的注释数,因此需要进行非规范化

这意味着您需要在orders表中添加一个comments\u count列,当每个注释都添加到订单中时,如果删除了order的注释,只需增加或减少该注释即可

在添加新的注释计数列后,需要更新每个订单的注释计数


然后您就可以加载orders表,并且每个订单都有注释计数。

不起作用,需要花费大量时间将数据插入temp。表。我已经这样做了,以减少查询大小,但仍然需要大约3分钟,正如我在我的数据库1008725024949600和26532000中提到的那样,有很多记录存在于受尊重的表用户、订单和评论中。这对查询有问题吗?或者在MySql和PostgreSQL的情况下,可以说db支持的数据量有多大,你能建议或者提供一些不错的教程吗,谢谢你的帮助。你想一直使用它吗?在这种情况下,你可能需要聚合表或物化视图在plust之前查看整个数据,就在今天直接从表中查看。事实上,我是一个ROR程序员,所以不可能每次当用户想访问网页中的数据时,我们都这样做。你可以通过触发器刷新聚合表。“材料视图”视图通过命令“刷新视图”进行刷新。通过使用触发器,您可以从中进行选择,而无需求和。如果使用MAT VIEW,则每天刷新一次。在这两种情况下,都需要通过DESC对求和字段进行索引