J'utilise la requête suivante pour trouver les utilisateurs dont j'ai besoin d'envoyer des rappels quotidiens en fonction de leurs paramètres et du fuseau horaire. Cela fonctionne mais il s'est avéré qu'il utilise environ 50% de CPU et c'est vraiment lourd quand j'ajoute Limit 0,100.La requête MySQL utilise trop de CPU
(Il provoque même phpMyAdmin plantage ou quelque chose)
Table des utilisateurs: 3000 dossiers, tableau Messages: 12000+ dossiers, Paramètres du tableau: 3000 dossiers, tableau Reminders: 80000 dossiers (permet de rester user_id et date pour éviter les doublons)
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
Je lance cette requête toutes les 10 minutes et j'envoie des rappels via le serveur SMTP sendgrid.com. Pouvez-vous s'il vous plaît m'aider à optimiser cette requête afin qu'elle n'utilise pas autant de ressources?
Merci (et désolé pour mon anglais)
lieu d'abord commencer - regardez la stratégie d'index sur tous les de ces champs "id". –
JetProfiler si vous avez les ressources - http://www.jetprofiler.com/ –
Je voudrais aussi regarder ajouter actif à votre index aussi. –