首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高性能SQL

提高性能SQL
EN

Stack Overflow用户
提问于 2012-01-28 00:16:24
回答 4查看 132关注 0票数 1

当我运行下面的SQL查询时,性能非常慢。

表中有超过400,000行,我已经为CheckDate字段建立了索引。

CheckDate类型为datetime

代码语言:javascript
复制
SELECT username, COUNT(*) AS TotalUser
FROM table
       WHERE DATE(CheckDate) = CURDATE() 

如何改进呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-28 00:39:40

尝试使用范围比较而不是直接相等。换句话说,将您的查询重写为

代码语言:javascript
复制
SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate BETWEEN CURDATE() AND ADDDATE(CURDATE(), INTERVAL 1 DAY)

或者也许

代码语言:javascript
复制
SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate >= CURDATE() AND 
        CheckDate <  ADDDATE(CURDATE(), INTERVAL 1 DAY)

看看能不能帮上忙。

EDIT:或者可以将第一个查询修改为

代码语言:javascript
复制
SELECT username, COUNT(*) AS TotalUser
  FROM table
  WHERE CheckDate BETWEEN CURDATE() AND
                          ADDDATE(ADDDATE(CURDATE(), INTERVAL 1 DAY), INTERVAL -1 SECOND)

但这开始变得相当丑陋,我不确定是否允许在间隔说明符中使用负数。

无论如何,重点是,当您发现自己想要截断日期以查看它是否与其他日期匹配时,更好的选择通常是使用范围比较。一般而言,如果有任何方法可以避免在WHERE子句中对列值使用函数,请尽量避免这样做。

分享和享受。

票数 3
EN

Stack Overflow用户

发布于 2012-01-28 00:20:47

您不是在使用函数索引。您的WHERE子句使用了一个不使用索引的函数DATE()。使用CheckDate列作为直接比较器。

这并不意味着它会走得更快,但这将是我第一次开始。

票数 1
EN

Stack Overflow用户

发布于 2012-01-28 00:49:44

由于CheckDate函数的原因,将不会使用日期字段上的索引。

每次对列使用任何函数时,都不会使用该列上的索引。

在这种情况下,您应该考虑使用表达式DATE(CheckDate)在表上创建计算列,然后在计算列上创建索引(是的,它将在DB上持久化它,但我确信随后将使用该索引)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9036496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档