我在mysql表中有一个带有这种结构的表
id(主索引) 标题, 日期(日期时间) publicready(boolen)
我创建了这样的视图
CREATE view FROM SELECT * FROM tablename WHERE publicready AND date < NOW()
如果我针对它运行查询需要1.8秒但是
如果我从视图中删除日期范围相同的查询.0009秒
为什么会发生这种情况,我该如何解决?
我在所有columsn上放了一个索引,我们正在检查它确实在1.6
时略快一些答案 0 :(得分:4)
now()
的问题在于,这会禁止MySQL将查询结果放入缓存中
如果删除now,则所有选择条件都是常量,MySQL可以在创建视图时将视图的结果集放在缓存中。
now()
这是不可能的,每次强制执行完全执行。
答案 1 :(得分:2)
在WordPress中,我们通过添加额外状态来修复此问题,其值为“future”。这样就可以在不查看日期的情况下区分已发布和预定的帖子。如果维护这样的字段不适合你,你可以添加一个额外的标志(例如is_future)并验证它不是真的。
您可以选择保留下一个要在memcache中发布的项目的跟踪。然后查询该日期:
where publicready and date < :next_date
这样做将允许MySQL缓存查询,因为它将消除now()的使用。
答案 2 :(得分:1)
在日期列上添加索引。