MySQL запрос использует слишком много процессора - PullRequest
0 голосов
/ 30 сентября 2011

Я использую следующий запрос, чтобы найти пользователей, которым нужно отправлять ежедневные напоминания, основываясь на их настройках и часовом поясе.Это работает, но оказалось, что он использует около 50% ЦП и это действительно тяжело, даже когда я добавляю предел 0,100.

(он даже вызывает сбой phpMyAdmin или что-то в этом роде)

Таблица пользователей: 3000 записей, таблица сообщений: 12000+ записей, таблица настроек: 3000 записей, таблица напоминаний: 80000 записей (сохраняет user_id идата для предотвращения дублирования)

   SELECT u.`id`, u.`fullname`, u.`email`, u.`hash`, s.`timezone`
   FROM `users` u
   LEFT JOIN `reminders` rm ON rm.`user_id` = u.`id` AND rm.`date` = CURDATE()
   LEFT JOIN `settings` s ON s.`user_id` = u.`id`
   LEFT JOIN `posts` p ON p.`user_id` = u.`id` AND p.`date` = DATE(CONVERT_TZ(UTC_TIMESTAMP, 'UTC', s.`timezone`))
   WHERE HOUR(CONVERT_TZ(UTC_TIMESTAMP, 'UTC', s.`timezone`)) = s.`notify_hour`
   AND s.`notify` = 1 AND u.`active` = 1 AND rm.`id` IS NULL AND p.`id` IS NULL
   GROUP BY u.`id` LIMIT 0,100

Я выполняю этот запрос каждые 10 минут и отправляю напоминания через SMTP-сервер sendgrid.com.Не могли бы вы помочь мне оптимизировать этот запрос, чтобы он не использовал столько ресурсов?

Спасибо (и извините за мой английский)

1 Ответ

0 голосов
/ 30 сентября 2011

Правильно ли проиндексированы поля?Вот предложение:

Попробуйте индексировать поле user_id во всех таблицах, оно должно сделать его быстрее.

Кроме того, преобразование дат расходует время процессора, вы должны хранить датыв формате UTC в вашей базе данных таким образом вы избежите огромных накладных расходов

...