Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
加快MySQL语句的速度_Mysql_Query Optimization - Fatal编程技术网

加快MySQL语句的速度

加快MySQL语句的速度,mysql,query-optimization,Mysql,Query Optimization,我正在尝试获取存储在seotc中的需要进行的调查计数,以及存储在seotcresults\u v2中的已完成调查计数。seotc表保存了近100k条记录,而seotcresults_v2表保存了大约一半的记录。如何加快查询速度 SELECT DISTINCT seotcresults_v2.Clock, COUNT(seotc.Id) AS Surveys, COUNT(seotcresults_v2.Id) AS Complete FROM seotc JOIN seot

我正在尝试获取存储在
seotc
中的需要进行的调查计数,以及存储在
seotcresults\u v2
中的已完成调查计数。
seotc
表保存了近100k条记录,而
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
更新:

谢谢你的回复。表结构(至少)如下所示:

seotc: |Id |时钟| CampusID |术语|

seotcresults_v2: |Id | Clock | CampusID | Term | Q1 | Q2 |等

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

其中,“
Clock
”是讲师的Id,可以在
seotc
seotcresults_v2
表中多次找到,因为他们有多个课程,每个课程都有多个学期的多个调查。我基本上是试图根据给定学期内对给定校园的讲师进行的调查数量,以及给定相同参数发布的结果数量,来确定回复率。这有用吗


我将很快尝试运行EXPLAIN。

首先要检查的是:WHERE子句列是否已索引

那么:您需要订购吗?这是一种,而且很贵


最后,是否对.clock列进行了索引?

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

为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

您可能需要将表结构添加到问题中。您在这些表上定义了哪些索引?另外,请对查询运行EXPLAIN并粘贴输出。COUNT()s是否需要GROUP BY才能工作?请尝试在seotcresults_v2.(时钟,CampusID,Term)或(时钟,Term,CampusID)上创建复合索引?你所说的索引是什么意思?如“它们在自己的表中是否具有正确的自动递增Id?”如果这是一个问题,那么不,它们不是,但CampusID是唯一的。这就是你的意思吗?我不是DBA,我所学的都是自学的。如果你有耐心给我指出正确的方向,我很想了解这一点。自动递增的ID(序列、标识,无论db如何称呼)不是索引,它只是每行上自动递增的唯一标识符字段。索引是一个独立于表的实体;在表包含数据的地方,索引只包含键字段(通常是散列的)和指向表的指针,在表中可以找到与该键关联的数据。通常,标识(序列、自动编号等)字段有一个自动创建的索引,它强制执行唯一性。但是,RDBMS不会自动为其他字段创建索引-您必须自己创建索引。一般来说,在WHERE、ORDER/GROUP BY或JOIN子句中指定的任何字段都可能是索引的候选字段。在没有索引的情况下,RDBMS每次需要比较两个字段或一个值与一个字段时,通常必须对整个表进行“表扫描”,这需要很长时间(随着表的增长,扫描次数越来越多)。索引让RDBMS“快捷方式”通过一个有序的键(或值)列表来扫描和比较表,这要快得多。