Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/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
优化where语句MYSQL_Mysql_Sql_Optimization_Where - Fatal编程技术网

优化where语句MYSQL

优化where语句MYSQL,mysql,sql,optimization,where,Mysql,Sql,Optimization,Where,我写这个复杂的查询是为了返回一个大数据集,大约有100000条记录。在我将此OR语句添加到WHERE子句之前,查询运行良好: 和(responses.StrategyFk=strategies.Id或responses.StrategyFk为 空) 现在我明白了,把or语句放进去会增加很多开销 没有这句话,只是: 和responses.StrategyFk=strategies.Id 查询将在15秒内运行,但不会返回任何没有fk链接策略的记录 虽然我也想要这些唱片。有没有一个简单的where语句

我写这个复杂的查询是为了返回一个大数据集,大约有100000条记录。在我将此OR语句添加到WHERE子句之前,查询运行良好:

和(responses.StrategyFk=strategies.Id或responses.StrategyFk为 空)

现在我明白了,把or语句放进去会增加很多开销

没有这句话,只是:

和responses.StrategyFk=strategies.Id

查询将在15秒内运行,但不会返回任何没有fk链接策略的记录

虽然我也想要这些唱片。有没有一个简单的where语句更容易找到这两条记录?我不能只为null记录添加另一个AND语句,因为这将破坏前面的语句。有点不确定从这里到哪里去

这是我问题的下半部分

FROM 
responses, subtestinstances, students, schools, items,
strategies, subtests

WHERE
subtestinstances.Id = responses.SubtestInstanceFk
AND subtestinstances.StudentFk = students.Id
AND students.SchoolFk = schools.Id
AND responses.ItemFk = items.Id
AND (responses.StrategyFk = strategies.Id Or responses.StrategyFk IS Null)
AND subtests.Id = subtestinstances.SubtestFk

尝试使用显式
JOIN
s:

...
FROM   responses a
       INNER JOIN subtestinstances b
               ON b.id = a.subtestinstancefk
       INNER JOIN students c
               ON c.id = b.studentfk
       INNER JOIN schools d
               ON d.id = c.schoolfk
       INNER JOIN items e
               ON e.id = a.itemfk
       INNER JOIN subtests f
               ON f.id = b.subtestfk
       LEFT JOIN strategies g
              ON g.id = a.strategyfk 
尝试:

就这样。实际上不需要OR条件,因为在这种情况下左连接就是这样做的。Anywhere responses.StrategyFk为NULL将导致与
strategies
表不匹配,并将为此返回一行

有关联接的简单说明,请参见此链接:


之后,如果您仍然存在性能问题,那么您可以开始查看
EXPLAIN-SELECT输出并查找可能需要添加的索引

啊,非常感谢!这将大大提高效率。看起来我应该从现在开始使用这种显式连接方法;它更容易与他人合作,也更容易让他人阅读和理解您正在尝试做的事情。同时感谢您的帮助。
SELECT ... FROM 
responses
JOIN subtestinstances ON subtestinstances.Id = responses.SubtestInstanceFk
JOIN students ON subtestinstances.StudentFk = students.Id
JOIN schools ON students.SchoolFk = schools.Id
JOIN items ON responses.ItemFk = items.Id
JOIN subtests ON subtests.Id = subtestinstances.SubtestFk
LEFT JOIN strategies ON responses.StrategyFk = strategies.Id