【问题标题】:date range in mysql view cause slownessmysql 视图中的日期范围导致运行缓慢
【发布时间】:2011-06-07 19:47:21
【问题描述】:

我在mysql表中有一个具有这种结构的表

id(主索引) 标题, 日期(日期时间) publicready(布尔)

我创建这样的视图

 CREATE view FROM SELECT * FROM tablename WHERE publicready AND date < NOW() 

如果我对它运行查询需要 1.8 秒,但是

如果我从同一查询中删除日期范围 0.0009 秒

为什么会发生这种情况,我该如何解决?

我在我们正在检查的所有列上都设置了一个索引,它确实在 1.6 时稍微快了一点

【问题讨论】:

  • 选择date &gt; now()有什么用,这些数据库记录是未来的吗?
  • 日期可能是某个未来的日期(例如交货)。
  • 实际上应该是 关键是要确保日期不在未来

标签: mysql date-range


【解决方案1】:

now() 的问题在于这会禁止 MySQL 将您的查询结果放入缓存中。
如果你删除现在,所有的选择标准都是常数,MySQL 可以在创建视图时将视图的结果集放入缓存中。

使用 now() 这是不可能的,每次都强制执行完整。

【讨论】:

  • 好的,如果不使用 now() 或 current_timestamp ,我怎么能得到所有不在未来的项目呢?
  • 创建一个额外的表:table_now - id:integer 主键,datenow:date。执行replace into table_now (id, datenow) values (1,now())select t.* from tablename t inner join table_now n on (t.date &lt; n.datenow) where publicready 请注意table_now 永远只有1 行。
【解决方案2】:

在 WordPress 中,我们通过添加一个额外的状态来解决此问题,其值为“未来”。这允许在不检查日期的情况下区分已发布和预定的帖子。如果您无法选择维护这样的字段,您可以添加一个额外的标志(例如 is_future)并验证它不是真的。

您的替代方法可能是跟踪要在 memcache 中发布的下一个项目。然后查询该日期:

where publicready and date < :next_date

这样做将允许 MySQL 缓存查询,因为它将消除 now() 的使用。

【讨论】:

    【解决方案3】:

    在日期列上放置一个索引。

    【讨论】:

    • 与其使用现在,是否可以只使用当前日期的 11:59:59?这样您可以获得一些缓存优势(根据@Johan 的评论)。
    • 我不这么认为,可能会在当天的某个时间放入未来没有日期的项目
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多