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

时间:2017-09-02 20:23:21

标签: postgresql ruby-on-rails-4

我有3个表用户,订单和评论每个表都有10087250,24949600和26532000多条记录,我做了这个查询来计算每个订单的评论,但它需要超过半个小时才能执行,如何加快这个查询。 注意: foreig_key列上已有索引。

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;

3 个答案:

答案 0 :(得分:1)

对于第一个 - 可能是yuo需要ORDER BY子句才能将它与LIMIT一起使用 如果你需要大多数评论对,你可以ORDER BY count DESC

第二件事是comments.order_id = orders.id。为什么两个都用于GROUP?

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

这允许在过滤和分组之前避免连接所有表

答案 1 :(得分:0)

您可以在聚合记录之前尝试使用临时表。这可能有助于缩短查询时间。像这样......

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;

答案 2 :(得分:0)

我认为你需要减少订单和评论表之间不必要的连接。您想从表注释中获得的是订单的注释数量,因此您需要进行非规范化。

这意味着您需要在comments_count表中添加orders列,并且当每个评论都添加到订单时,只需删除或减少订单注释即可。< / p>

添加新的comments_count列后,您需要为每个订单更新comments_count

然后你可以加载订单表,你已经有了每个订单的评论数。