当我运行下面的SQL查询时,性能非常慢。
表中有超过400,000行,我已经为CheckDate字段建立了索引。
CheckDate类型为datetime
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE DATE(CheckDate) = CURDATE() 如何改进呢?
发布于 2012-01-28 00:39:40
尝试使用范围比较而不是直接相等。换句话说,将您的查询重写为
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 1 DAY)或者也许
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate >= CURDATE() AND
CheckDate < ADDDATE(CURDATE(), INTERVAL 1 DAY)看看能不能帮上忙。
EDIT:或者可以将第一个查询修改为
SELECT username, COUNT(*) AS TotalUser
FROM table
WHERE CheckDate BETWEEN CURDATE() AND
ADDDATE(ADDDATE(CURDATE(), INTERVAL 1 DAY), INTERVAL -1 SECOND)但这开始变得相当丑陋,我不确定是否允许在间隔说明符中使用负数。
无论如何,重点是,当您发现自己想要截断日期以查看它是否与其他日期匹配时,更好的选择通常是使用范围比较。一般而言,如果有任何方法可以避免在WHERE子句中对列值使用函数,请尽量避免这样做。
分享和享受。
发布于 2012-01-28 00:20:47
您不是在使用函数索引。您的WHERE子句使用了一个不使用索引的函数DATE()。使用CheckDate列作为直接比较器。
这并不意味着它会走得更快,但这将是我第一次开始。
发布于 2012-01-28 00:49:44
由于CheckDate函数的原因,将不会使用日期字段上的索引。
每次对列使用任何函数时,都不会使用该列上的索引。
在这种情况下,您应该考虑使用表达式DATE(CheckDate)在表上创建计算列,然后在计算列上创建索引(是的,它将在DB上持久化它,但我确信随后将使用该索引)。
https://stackoverflow.com/questions/9036496
复制相似问题