【问题标题】:Speed up this MySQL Statement加速这个 MySQL 语句
【发布时间】:2010-12-09 15:55:46
【问题描述】:

我正在尝试获取存储在seotc 中的需要进行的调查计数,以及存储在seotcresults_v2 中的已完成调查计数。 seotc 表拥有近 10 万条记录,seotcresults_v2 表拥有大约一半的记录。如何加快查询速度?

SELECT 
  DISTINCT seotcresults_v2.Clock, 
  COUNT(seotc.Id) AS Surveys, 
  COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock
WHERE seotcresults_v2.CampusID = 40
AND seotcresults_v2.Term = 201011
ORDER BY seotc.Clock

更新:

感谢所有回复。表结构(最低限度)是这样的:

搜索引擎优化: |身份证 |时钟 |校园ID |术语 |

seotcresults_v2: |身份证 |时钟 |校园ID |学期 |第一季度 | Q2 | ...等

Id 是调查和调查结果的每个表中的自动递增索引

其中“Clock”是讲师的 ID,可以在 seotcseotcresults_v2 表中多次找到,因为它们有多个课程,并且每个课程针对多个学期完成了多项调查。我实际上是在尝试根据给定学期中给定校园的讲师的调查数量与在给定相同参数的情况下发布的结果数量来确定响应率。这有帮助吗?

我很快也会尝试运行 EXPLAIN。

【问题讨论】:

  • 您可能希望将表格结构添加到您的问题中。
  • 你在这些表上定义了哪些索引?
  • 另外,请在查询上运行 EXPLAIN 并粘贴输出。
  • 您不需要 GROUP BY 才能使 COUNT() 工作吗?
  • 尝试在 seotcresults_v2.(Clock,CampusID,Term) 或 (Clock,Term,CampusID) 上创建复合索引?

标签: mysql query-optimization


【解决方案1】:

首先要检查:WHERE 子句列是否已编入索引?

那么:你需要 ORDER BY,这是一种排序,而且很昂贵。

最后,.clock 列是否被索引?

【讨论】:

  • 索引到底是什么意思?如,“他们是否在自己的表中,具有适当的自动递增 ID?”如果这是问题,那么不,它们不是,但 CampusID 是唯一的。你是这个意思吗?我不是 DBA,我所学到的都是自学的。如果您有耐心为我指明正确的方向,我很乐意学习这一点。
  • 自动递增的 ID(序列、身份、无论你的 db-calls-it)不是索引 - 它只是每行上自动递增的唯一标识符字段。索引是与表分离的实体;在表包含数据的地方,索引只包含关键字段(通常是散列)和指向表的指针,用于在哪里可以找到与该键关联的数据。通常,身份(序列、自动编号等)字段具有自动创建的索引,从而强制唯一性。
  • 但是,RDBMS 不会自动为其他字段创建索引 - 您必须自己执行此操作。作为一个广泛的经验法则,您在 WHERE、ORDER/GROUP BY 或 JOIN 子句中指定的任何字段都可能是具有索引的候选者。如果没有索引,RDBMS 每次需要比较两个字段或一个字段的值时,通常必须对整个表进行“表扫描”,这需要很长时间(随着表的增长越来越多) .索引可以让 RDBMS 使用有序的键(或值)列表来扫描和比较表扫描,这要快得多。
【解决方案2】:

我认为这个查询甚至不会给你正确的结果。

为 CampusID 和 Term 以及可能的时钟添加索引。然后试试这个查询:

SELECT seotcresults_v2.Clock, 
       COUNT(seotc.Id) AS Surveys, 
       COUNT(seotcresults_v2.Id) AS Complete 
FROM seotc 
JOIN seotcresults_v2 ON seotcresults_v2.Clock = seotc.Clock
WHERE seotcresults_v2.CampusID = 40
AND seotcresults_v2.Term = 201011
GROUP by seotcresults_v2.Clock
ORDER BY seotcresults_v2.Clock

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2011-02-14
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多