2012-12-15 5 views
2

J'ai cette requête qui fonctionne bien sur deux tables company et question. Les deux tableaux sont structurés de la façon suivante:Améliorer la requête MySQL pour la performance

company | question 
id  | id 
name  | company_id 
      | sentiment 

SELECT company.id as company_id, company.name, question.sentiment, 
(SELECT count(*) FROM question 
WHERE question.sentiment=0 AND question.company_id=company.id) AS count 
FROM question 
JOIN company ON company.id=question.company_id 
WHERE question.sentiment = 0 GROUP BY company_id ORDER BY count DESC LIMIT 5 

J'ai essayé de comprendre comment récrire ceci afin d'éviter la sous-requête qui semble ralentir l'exécution de la requête. Les tables de questions ont plus de 1000 enregistrements. En outre, en utilisant les index ont diminué le temps d'exécution de 545.037 à 180.228 sec, encore j'ai besoin d'améliorer cela.

Merci

+0

Try 'expliquer étendue' et voir ce que l'optimiseur fait avec elle. Pourrait vous donner quelques indices sur la façon de procéder. – ethrbunny

+0

Le diagnostic des requêtes lentes nécessite des définitions complètes de table et d'index, pas seulement une description ou une paraphrase. Peut-être que vos tables sont mal définies. Peut-être que les index ne sont pas créés correctement. Sans voir les définitions de table et d'index, nous ne pouvons pas le dire. –

Répondre

2
ALTER TABLE question ADD INDEX (sentiment, company_id); 

SELECT c.id as company_id, c.name, q.sentiment, q.count 
FROM company c 
JOIN (
    SELECT company_id, MAX(sentiment) AS sentiment, COUNT(*) AS count 
    FROM question 
    WHERE sentiment = 0 
    GROUP BY company_id 
    ORDER BY NULL 
) AS q ON c.id = q.company_id 
ORDER BY count DESC LIMIT 5 
+0

Wow! Il est passé de 180 secondes à 0,640 secondes, je ne peux pas le croire. Merci beaucoup – Lomse

Questions connexes