我有一个简单的问题,或者至少问题的症状很简单。下面的查询是闪电般的快,没有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/