我必须获取数据库中publish_date在两个日期之间的所有条目。所有日期都存储为整数,因为日期采用UNIX时间戳格式...下面的查询效果很好,但它需要“太长时间”。它返回10到20个dazs之前所做的所有条目。
SELECT * FROM tbl_post WHERE published < (UNIX_TIMESTAMP(NOW())-864000)
AND published> (UNIX_TIMESTAMP(NOW())-1728000)
有什么方法可以优化这个查询吗?如果我没记错的话,它是在每个条目上调用NOW()和UNIX_TIMESTAMP。我认为将这两个重复函数的结果保存到mysql @var中会使比较速度更快,但事实并非如此。我运行的第二个代码是:
SET @TenDaysAgo = UNIX_TIMESTAMP(NOW())-864000;
SET @TwentyDaysAgo = UNIX_TIMESTAMP(NOW())-1728000;
SELECT * FROM tbl_post WHERE fecha_publicado < @TenDaysAgo
AND fecha_publicado > @TwentyDaysAgo;
另一个令人困惑的事情是PHP不能通过mysql_query();?!运行bove查询。
如果您对此问题有任何意见,欢迎访问:)
卢卡
发布于 2011-04-26 01:03:50
PHP的mysql_query函数(假设这就是您正在使用的)对于每个字符串只能接受一个查询,因此它不能执行您的第二个查询中的三个查询。
我建议将这些东西移到stored procedure中,并从PHP中调用它。
至于优化,设置这些变量的优化程度与查询所需的优化程度差不多。您需要对每一行进行比较,并且设置一个变量可以提供最快的访问下限和上限的时间。
对表的索引而不是查询本身的一个改进是将索引聚集在fecha_publicado周围,以允许MySQL智能地处理针对该范围值的查询。通过将fecha_publicado设置为表的主键,可以很容易地做到这一点。
发布于 2011-04-26 01:06:57
请确保在published.And上有索引,并确保正在使用它。
EXPLAIN SELECT * FROM tbl_post WHERE published < (UNIX_TIMESTAMP(NOW())-864000) AND published> (UNIX_TIMESTAMP(NOW())-1728000)
这应该是一个很好的开始,看看查询中发生了什么。要添加索引,请执行以下操作:
ALTER TABLE tbl_post ADD INDEX (published)
发布于 2011-04-26 01:05:39
需要检查的显而易见的事情是,在发布日期是否有索引,以及它是否正在使用?
https://stackoverflow.com/questions/5780789
复制相似问题