如何使用JOINS和嵌套SELECT来优化此SQL查询?

问题描述:

我的SQL查询需要很多时间来执行,因为事务表非常巨大。我正在寻找方法来改善此查询的性能。如何使用JOINS和嵌套SELECT来优化此SQL查询?

SELECT users.user_id, users.name as user, IFNULL(SUM(IF(transactions.recipient_account = users.account_id,transactions.money,0-transactions.money)),0) as total 
FROM users as users 
JOIN 
(SELECT account_id as system_account FROM accounts WHERE user_guid IS NULL AND name IS NULL LIMIT 1) as tmp 
LEFT JOIN (transactions as transactions) 
    ON (users.account_id IN (transactions.sender_account,transactions.recipient_account)) 
WHERE (users.hidden = 0) 
    AND ((transactions.flags & 1) = 0 
    OR transactions.flags IS NULL) 
GROUP BY users.user_guid 
ORDER BY total DESC 
LIMIT 0,5 

我对索引很感兴趣,但我不确定如何在这里使用它们。

谢谢任何​​帮助或建议。

+0

请向我们提供解释结果,并向我们提供您在受影响的表格和索引中包含的字段的索引。没有这些,任何答案都将基于纯粹的猜测。 – Shadow

+1

通常,您将为查询的where子句中使用的列添加索引。您可以在这些列上添加/删除索引,以查看它是否可以提高性能。 – Clay

accounts: INDEX(user_guid, name, account_id) 
users: INDEX(hidden, account_id) 

请为每个表提供SHOW CREATE TABLE;与此同时,我们可能会有进一步的建议。

Index Cookbook