Как я могу оптимизировать этот SQL-запрос с помощью объединений и вложенного ВЫБОРА?

#mysql #sql #query-performance

#mysql #sql #запрос-производительность

Вопрос:

Мой 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 amp; 1) = 0 
   OR transactions.flags IS NULL)
GROUP BY users.user_guid 
ORDER BY total DESC 
LIMIT 0,5
  

Я серьезно отношусь к индексам, но я не уверен, как их использовать здесь.

Спасибо за любую помощь или совет.

Комментарии:

1. Пожалуйста, предоставьте нам результат объяснения, а также предоставьте нам индексы, которые у вас есть в затронутых таблицах, и поля, которые включают эти индексы. Без этого любой ответ был бы основан на чистых догадках.

2. Как правило, вы добавляете индексы к столбцам, которые используются в предложении where ваших запросов. Вы можете добавлять / удалять индексы в этих столбцах, чтобы увидеть, улучшает ли это производительность или нет.

Ответ №1:

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

Пожалуйста, укажите SHOW CREATE TABLE для каждой таблицы; с этим у нас могут быть дополнительные рекомендации.

Поваренная книга индекса.