我有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;
答案 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
。
然后你可以加载订单表,你已经有了每个订单的评论数。