2011-09-21 2 views
1

J'ai la requête suivante:Tri par SUM très lent

SELECT SUM(s.count) as count, a.name, s.author_id as id 
    FROM twitter_author_daily_stats s 
    JOIN twitter_author a ON s.author_id = a.id 
    WHERE s.`date` >= '2011-01-07' 
    AND s.`date` <= '2011-09-21' 
    AND s.profile_twitter_search_id IN (263) 
GROUP BY s.author_id 
    LIMIT 30; 

Il utilise un index (author_id, profile_twitter_search_id, date); c'est rapide (~ 1s); et il renvoie ~ 2500 lignes.

Toutefois, lorsque j'ajoute ORDER BY count, la requête s'exécute pendant quelques minutes (je n'ai pas pris la peine d'attendre qu'elle se termine).

Ne devrait-il pas prendre les ~ 2500 lignes de la requête originale et trier par colonne count? Pourquoi cela prend-il autant de temps?

Est-ce que quelqu'un qui a une meilleure connaissance de MySQL peut expliquer?

+0

Je pense qu'il serait préférable de grouper le résultat par 'a.id'. – Karolis

Répondre

1

Encore mieux: obtenez MySQL pour l'expliquer, avec le mot-clé EXPLAIN bien nommé.

Les optimisations avec des index ne peuvent être effectuées qu'en certainsituations, et la modification de l'ordre/du regroupement/des conditions est un bon moyen de modifier considérablement le paysage.

+0

Je l'ai déjà fait et ce n'est pas très utile. Avec ORDER BY, il utilise une table temporaire et un fichier. Sans cela, ce n'est pas le cas. Cependant, il n'explique pas pourquoi il ne peut pas trier ~ 2500 lignes dans un délai raisonnable. Sûrement, en créant une table temporaire de ~ 2500 lignes et en triant cela ne peut pas prendre autant de temps. Il se passe quelque chose d'étrange en interne que je ne comprends pas. –

+0

@Pawel: Il est _incredibly_ utile. Et il n'y a rien de "bizarre" qui se passe; vous avez simplement manqué de lire la documentation. Sauf si vous avez géré les deux sections auxquelles je vous ai relié en seulement 8 minutes, ce qui semble improbable. Comme je l'ai dit, il n'y a pas que le tri du résultat: ce n'est pas ce que votre «ORDER BY» signifie. –

+0

J'avais lu ces pages avant de poster la question. Je n'ai pas trouvé de solution. Êtes-vous en train de dire qu'il y a une solution que j'ai ratée? –