查询需要30秒的时间

时间:2012-03-28 19:23:53

标签: php mysql

我们有一个注册系统数据库,基本上这个查询的作用是检查班级中的学生,以便在没有他们时可以选择将他们标记为缺席。出于某种原因,需要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

3 个答案:

答案 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))