2011-09-30 3 views
0

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)

+1

lieu d'abord commencer - regardez la stratégie d'index sur tous les de ces champs "id". –

+0

JetProfiler si vous avez les ressources - http://www.jetprofiler.com/ –

+0

Je voudrais aussi regarder ajouter actif à votre index aussi. –

Répondre

0

Avez-vous les champs correctement indexés? voici une suggestion:

Essayez d'indexer le champ user_id sur toutes les tables cela devrait le rendre plus rapide.

également la conversion des dates gruge le temps cpu, vous devez enregistrer les dates au format UTC dans votre base de données de cette façon, vous éviterez une tête énorme

+0

le nom de la colonne de la table "Users" est "id" reste sont "user_id". Est-ce que c'est bon? – Sallar

+1

Oui, l'appellation n'a pas d'importance - les index sont importants. –

+0

OK merci, laissez-moi vérifier – Sallar

Questions connexes