2012-12-15 147 views
2

我有这个查询运行良好的两个表companyquestion。这两个表是结构化的方式如下:提高MySQL查询性能

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 

我一直在试图找出如何才能避免这似乎减缓查询执行的子查询重写这个。 问题表有1000多条记录。 此外,使用索引已将执行时间从545.037秒减少到180.228秒,但仍需要改进。

感谢

+0

尝试“解释”延伸,看到了优化器如何处理它。可能会给你一些关于如何进行的线索。 – ethrbunny

+0

诊断慢查询需要全表和索引定义,而不仅仅是描述或释义。也许你的表格定义不好。也许索引没有正确创建。没有看到表和索引定义,我们不能说。 –

回答

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

哇!它已经从180秒下降到0.640秒,我不敢相信。非常感谢 – Lomse