mysql – 两个查询分开很快,当作为子查询加入时很慢

我有两个查询,每个查询自己运行得非常快(少于2秒).但是,当我尝试将它们作为子查询加入时,它的运行速度非常慢.我最后一次跑它需要大约68秒.这是完整的查询:

SELECT t.count,
       t.total
  FROM (SELECT t.account_number,
               COUNT(t.id) count,
               SUM(t.amount) total,
               ib.id import_bundle_id
          FROM import_bundle ib
          JOIN generic_import gi ON gi.import_bundle_id = ib.id
          JOIN transaction_import ti ON ti.generic_import_id = gi.id
          JOIN account_transaction t ON t.transaction_import_id = ti.id
          JOIN transaction_code tc ON t.transaction_code_id = tc.id
         WHERE tc.code IN (0, 20, 40)
      GROUP BY t.account_number) t
  JOIN (SELECT a.account_number,
               np.code
          FROM import_bundle ib
          JOIN generic_import gi ON gi.import_bundle_id = ib.id
          JOIN account_import ai ON ai.generic_import_id = gi.id
          JOIN account a ON a.account_import_id = ai.id
          JOIN account_northway_product anp ON anp.account_id = a.id
          JOIN northway_product np ON anp.northway_product_id = np.id
         WHERE np.code != 'O1') a ON t.account_number = a.account_number

这个查询应该运行缓慢并不是一个惊喜.如果这是两个单独的表而不是子查询,我会在其account_number列上放置索引.但是,显然不可能在查询结果上放置索引,所以我不能这样做.我怀疑这是问题的一部分.

除此之外,我不明白为什么查询速度慢,除了添加两个汇总表之外我没有任何关于如何加速查询的想法,如果我没有,我不想这样做至.

顺便说一下,这个英文查询可能是“为所有不透支保护账户(代码O1)的账户获取所有POS交易(代码0,20和40).”

最佳答案
将检查放入主查询中:

SELECT  t.account_number,
        COUNT(t.id) count,
        SUM(t.amount) total,
        ib.id import_bundle_id
FROM    transaction_code tc
JOIN    account_transaction t
ON      t.transaction_code_id = tc.id
JOIN    transaction_import ti
ON      ti.id = t.transaction_import_id
JOIN    generic_import gi
ON      gi.id = ti.generic_import_id
JOIN    import_bundle ib
ON      ib.id = gi.import_bundle_id
WHERE   tc.code IN (0, 20, 40)
        AND t.account_number NOT IN
        (
        SELECT  anp.id
        FROM    account_northway_product anp
        JOIN    northway_product np
        ON      np.id = anp.northway_product_id
        WHERE   np.code = '01'
        )
GROUP BY
        t.account_number

创建以下索引:

transaction_code (code)
account_transaction (transaction_code_id)
account_transaction (account_number)

转载注明原文:mysql – 两个查询分开很快,当作为子查询加入时很慢 - 代码日志