我在连接几个大表时有一个 SQL 查询。我的数据库由用户、订单和交易表中的数百万行组成。这是查询
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN transactions t ON o.id = t.order_id
WHERE t.status = 'completed'
GROUP BY u.name
HAVING order_count > 10;
我确保所有必要的字段都有索引。 users.id、orders.user_id 和 transactions.order_id。然而,随着数据集大小的增加,查询变得明显变慢。
订单表大约有 500 万行。 交易表大约有 1000 万行。 数据库运行在 MySQL 8 上。
在这种情况下,哪些优化技术或查询重组可以帮助提高性能?
这会延迟名称查找,直到
GROUP BY
之后
SELECT u.name
ot.order_count
FROM (
SELECT o.user_id,
COUNT(*) AS order_count
FROM orders o
JOIN transactions t ON o.id = t.order_id
WHERE t.status = 'completed'
GROUP BY o.user_id
HAVING order_count > 10 ) AS ot
LEFT JOIN users u ON u.id = ot.user_id;
这是“覆盖”,对于交易查找很有用:
INDEX(status, order_id)