【问题标题】:mysql with date function query running slow带有日期函数查询的mysql运行缓慢
【发布时间】:2020-10-02 04:45:32
【问题描述】:

我今天在执行查询时发现了一些奇怪的东西,我想知道这是怎么发生的。

以下是我的查询:

select sum(price) as total from table_a where testing_date = '2020-06-10' 

此查询在搜索数据时需要 2-5 秒。现在我在查询中做了如下的小改动:

select sum(price) as total from table_a where date(testing_date) = '2020-06-10' 

在这种情况下,查询需要 2-3 分钟。这里 testing_date 列数据采用 dateTime 格式,例如:2020-06-01 00:00:00

这里的总记录大小超过 700 万。

【问题讨论】:

  • 您不再按索引数据过滤?
  • @ÁlvaroGonzález,我在列上添加了索引
  • 您尚未共享您的数据库结构,但您似乎没有function based index 用于DATE(testing_date)。如果您不想添加一个,则需要重写查询以使用现有的。
  • testing_date的数据类型是什么?
  • @RickJames 数据类型的 testing_date 是 datetime

标签: mysql sql select query-optimization where-clause


【解决方案1】:

不要在您过滤的列上使用函数。这使得查询不可 SARGeable,这意味着数据库无法利用现有索引。基本上,您是在强制数据库在过滤发生之前对列中的每个值进行计算。

如果你想在给定的一天进行过滤,你可以使用半开区间的不等式:

where testing_date >= '2020-06-10' and testing_date < '2020-06-11'

【讨论】:

  • 是的,这很好用....谢谢您的解决方案...我想知道为什么上面的日期功能要花这么多时间....我得到了答案。
  • 最好的情况是其中 testing_date = '2020-06-10' 还是您的解决方案?
  • 请发布 SHOW CREATE TABLE table_a 的 TEXT 结果;用于确认列的数据类型。
  • @MiteshBhanushali:如果您的日期没有 time 部分,那么 ` testing_date = '2020-06-10' ` 就可以了。我的建议是如果日期有时间部分。
  • @MiteshBhanushali 请理解,如果您可以发布 SHOW CREATE TABLE table_a 以最大限度地减少关心帮助您成功使用日期选择编码的多个人的问题和回答,这将很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2021-11-04
相关资源
最近更新 更多