使用PHP会话值的MySQL使用CURDATE执行缓慢


MySQL using PHP session values slow execution with CURDATE

我在继承的PHP控制面板/管理屏幕上有一系列MySQL记录集和查询。我发现两个查询似乎特别慢,而且都使用CURDATE,所以我认为这可能是问题所在,或者至少这似乎是共享元素,使它们与其他查询不同,只是有点复杂。

我压缩了语句以使用IN语句,在那里我可以优化它,但我不知道还能做些什么来加快这些查询的速度,或者用CURDATE代替更好的查询?

当我删除PHP会话值之后的所有内容,包括CURDATE和其他and/OR语句时,它显然加快了查询速度。

查询1:

SELECT COUNT(ID) AS total_count
FROM HTG_ScheduleRequest
WHERE AssignedTech = '".$emp."'
    AND (ScheduleDateExact > CURDATE())
    AND JobStatus IN (2,5,8)
    AND RecordType = '1'
    OR SSR = '".$emp."'
    AND (ScheduleDateCurrent > CURDATE())
    AND JobStatus IN (3,4)
    AND RecordType = '1'

查询2:

SELECT COUNT(ID) AS total_count
FROM HTG_ScheduleRequest
WHERE AssignedTech = '".$emp."'
    AND JobStatus IN (2,5,8)
    AND ScheduleDateExact >= DATE_ADD(CURDATE(), INTERVAL 1 DAY)
    AND ScheduleDateExact < DATE_ADD(CURDATE(), INTERVAL 2 DAY)
    AND RecordType = '1'
    OR SSR = '".$emp."'
    AND JobStatus IN (3,4)
    AND ScheduleDateCurrent >= DATE_ADD(CURDATE(), INTERVAL 1 DAY)
    AND ScheduleDateCurrent < DATE_ADD(CURDATE(), INTERVAL 2 DAY)
    AND RecordType = '1'

重新格式化查询后,您的逻辑似乎被破坏了。我相信你想要:

SELECT COUNT(ID) AS total_count
FROM HTG_ScheduleRequest
WHERE (
        AssignedTech = '".$emp."'
        AND (ScheduleDateExact > CURDATE())
        AND JobStatus IN (2,5,8)
        AND RecordType = '1'
    ) OR (
        SSR = '".$emp."'
        AND (ScheduleDateCurrent > CURDATE())
        AND JobStatus IN (3,4)
        AND RecordType = '1'
    )

除此之外,您的查询看起来很好,日期函数的详细信息应该不会影响任何内容。我建议查看这些查询的EXPLAIN输出,看看是否需要定义或调整表上的索引。