大型数据集和多个连接时 SQL 查询性能显着下降

问题描述 投票:0回答:1

我在连接几个大表时有一个 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 上。

在这种情况下,哪些优化技术或查询重组可以帮助提高性能?

sql mysql performance query-optimization
1个回答
1
投票

这会延迟名称查找,直到

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)
© www.soinside.com 2019 - 2024. All rights reserved.