【问题标题】:Improve MySQL query for performance改进 MySQL 查询以提高性能
【发布时间】:2012-12-15 18:16:39
【问题描述】:

我有这个查询在companyquestion 两个表上运行良好。两个表的结构如下:

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 秒,我仍然需要改进。

谢谢

【问题讨论】:

  • 尝试“解释扩展”,看看优化器如何处理它。可能会给你一些关于如何进行的线索。
  • 诊断慢查询需要完整的表和索引定义,而不仅仅是描述或解释。也许您的表格定义不佳。也许索引没有正确创建。没有看到表和索引定义,我们无法分辨。

标签: mysql performance select group-by


【解决方案1】:
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

【讨论】:

  • 哇!它已经从 180 秒下降到 0.640 秒,我不敢相信。非常感谢
猜你喜欢
  • 2011-12-03
  • 2023-04-08
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2012-10-19
  • 2011-07-02
相关资源
最近更新 更多