我们有一个注册系统数据库,基本上这个查询的作用是检查班级中的学生,以便在没有他们时可以选择将他们标记为缺席。出于某种原因,需要30秒。有人知道为什么吗?
FROM Stdts
LEFT JOIN StdtReg ON StdtReg.StdtID = Stdts.ID
LEFT JOIN usrs ON StdtReg.userID = usrs.ID
WHERE (SELECT ID FROM ClssInstncEnrol cie WHERE cie.status = 0 AND classInstanceID={$_GET['ci']} AND StdtID = Stdts.ID LIMIT 1) IS NOT NULL
OR (SELECT ID FROM DropIns di WHERE di.type <> -1 AND classInstanceID= {$_GET['ci']} AND StdtID = Stdts.ID LIMIT 1) IS NOT NULL
AND (CONCAT(Stdts.firstName, ' ', Stdts.lastName) OR CONCAT(usrs.firstName,' ', usrs.lastName))
ORDER BY firstName, lastName
答案 0 :(得分:1)
在它之前使用“EXPLAIN”运行查询,它将告诉您每个表的连接方式以及您可能缺少索引的位置。
此外,对于此表单的查询,您将在SQL查询中等待,并且在查询中直接插入HTTP参数。
最后,你已经停止了一些查询和架构,但这让我觉得可以通过连接而不是子选择来完成,或者甚至作为单独的查询来更有效地生成学生ID列表甚至运行主查询。
答案 1 :(得分:0)
尝试检查查询的执行计划以查看可能出现的错误(如果您有大表并且没有使用适当的索引,那么它可能很长)
答案 2 :(得分:0)
也许这个:
AND (CONCAT(Stdts.firstName, ' ', Stdts.lastName) OR CONCAT(usrs.firstName,' ', usrs.lastName))
应该是:
AND (CONCAT(Stdts.firstName, ' ', Stdts.lastName) = CONCAT(usrs.firstName,' ', usrs.lastName))