优化where语句MYSQL
我写这个复杂的查询是为了返回一个大数据集,大约有100000条记录。在我将此OR语句添加到WHERE子句之前,查询运行良好: 和(responses.StrategyFk=strategies.Id或responses.StrategyFk为 空) 现在我明白了,把or语句放进去会增加很多开销 没有这句话,只是: 和responses.StrategyFk=strategies.Id 查询将在15秒内运行,但不会返回任何没有fk链接策略的记录 虽然我也想要这些唱片。有没有一个简单的where语句更容易找到这两条记录?我不能只为null记录添加另一个AND语句,因为这将破坏前面的语句。有点不确定从这里到哪里去 这是我问题的下半部分优化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语句
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