Des conseils pour l'amélioration de cette lenteur de la requête mysql?

Je suis en utilisant une requête qui, généralement, s'exécute en moins d'une seconde, mais parfois cela prend entre 10 et 40 secondes pour terminer. En fait, je suis pas totalement clair sur la façon dont la sous-requête fonctionne, je sais juste qu'il travaille, qu'il me donne 15 lignes pour chaque faverprofileid.

Je suis la journalisation des requêtes lentes et il me dit 5823244 lignes ont été examinés, ce qui est bizarre, parce qu'il n'y a pas n'importe où près que le nombre de lignes dans les tables concernées (le tableau de favoris a plus de 50 000 lignes).

Quelqu'un peut-il m'offrir quelques conseils? Est-il un problème avec la sous-requête et avoir besoin d'utiliser filesort?

EDIT: Exécution d'expliquer montre que la table des utilisateurs n'est pas à l'aide d'un indice (même si id est la clé primaire). En vertu de l'extra il dit: à l'Aide temporaire; à l'Aide de filesort.

SELECT F.id,F.created,U.username,U.fullname,U.id,I.*   
FROM favorites AS F  
INNER JOIN users AS U ON F.faver_profile_id = U.id  
INNER JOIN items AS I ON F.notice_id = I.id  
WHERE faver_profile_id IN (360,379,95,315,278,1)  
AND F.removed = 0  
AND I.removed = 0   
AND F.collection_id is null   
AND I.nudity = 0  
AND (SELECT COUNT(*) FROM favorites WHERE faver_profile_id = F.faver_profile_id  
AND created > F.created AND removed = 0 AND collection_id is null) < 15 
ORDER BY F.faver_profile_id, F.created DESC;
Vous pourriez obtenir une meilleure coloration de la syntaxe, si vous écrivez "select", "de", "où", "et", "dans" et "commande par" mots-clés dans les petites lettres, et "intérieure", "joindre", "sur" et "desc" avec seulement la première lettre en majuscule.
Êtes-vous essayer de sélectionner les 15 premiers éléments pour chaque faver_profile_id commandé par créé?
Avez-vous analyse sur les tables?
La table des utilisateurs n'était pas à l'aide d'un index et les favoris de l'été à l'aide de la "suppression" de l'index au lieu de faver_profile_id. Pour certains, la raison de la suppression de la "suppression" de l'index (que je n'ai pas vraiment besoin) fixe ces deux questions. J'ai aussi opté pour des GROUP BY et HAVING et la requête fonctionne maintenant très rapide. Merci!

OriginalL'auteur makeee | 2009-02-26