我有一个简单的问题,或者至少问题的症状很简单。下面的查询是闪电般的快,没有GROUP BY(0.15秒),但是有GROUP BY(超过100秒)的超慢。有什么办法改善这种情况吗?

  SELECT a.id, SUM(t.amount)
    FROM account_transaction t
    JOIN transaction_code tc ON t.transaction_code_id = tc.id
    JOIN account a ON t.account_number = a.account_number
    JOIN account_northway_product anp ON anp.account_id = a.id
    JOIN northway_product np ON np.id = anp.northway_product_id
   WHERE 1
     AND np.code != 'O1'
     AND tc.code IN (0, 20, 40)
GROUP BY a.id

编辑:当我在查询的EXPLAIN版本上执行GROUP BY时,除了一行之外,所有内容看起来都很好:
select_type: simple
table: tc
type: index
possible_keys: PRIMARY,code,code_2
key: code
key_len: 257
ref: NULL
rows: 30
Extra: Using where; Using index; Using temporary; Using filesort

从我对EXPLAIN的了解来看,key_len是不好的,因为它很长。“Using temporary;Using filesort;”也不好。我想我可以做的一件事是减少transaction_code.code的长度,因为我可能永远不需要超过3个字符。不过,我不知道该怎么处理“使用临时文件;使用文件排序”。

最佳答案

可能(?)查询计划器可能会删除这些表,但看起来查询中有不需要的表。还重新排列了联接,以便首先列出帐户。

SELECT a.id,
       SUM(t.amount)
  FROM
    account a
        INNER JOIN account_northway_product anp ON anp.account_id = a.id
            INNER JOIN northway_product np ON np.id = anp.northway_product_id
        INNER JOIN account_transaction t ON t.account_number = a.account_number
            INNER JOIN transaction_code tc ON t.transaction_code_id = tc.id
 WHERE
   np.code != 'O1'
   AND tc.code IN (0, 20, 40)
 GROUP BY a.id

关于mysql - 有什么办法可以提高GROUP BY的性能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5718168/

10-16 15:35