首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化SQL查询

优化SQL查询
EN

Stack Overflow用户
提问于 2011-04-26 01:00:11
回答 5查看 306关注 0票数 1

我必须获取数据库中publish_date在两个日期之间的所有条目。所有日期都存储为整数,因为日期采用UNIX时间戳格式...下面的查询效果很好,但它需要“太长时间”。它返回10到20个dazs之前所做的所有条目。

代码语言:javascript
运行
复制
SELECT * FROM tbl_post WHERE published <  (UNIX_TIMESTAMP(NOW())-864000) 
AND published> (UNIX_TIMESTAMP(NOW())-1728000)

有什么方法可以优化这个查询吗?如果我没记错的话,它是在每个条目上调用NOW()和UNIX_TIMESTAMP。我认为将这两个重复函数的结果保存到mysql @var中会使比较速度更快,但事实并非如此。我运行的第二个代码是:

代码语言:javascript
运行
复制
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查询。

如果您对此问题有任何意见,欢迎访问:)

卢卡

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-04-26 01:03:50

PHP的mysql_query函数(假设这就是您正在使用的)对于每个字符串只能接受一个查询,因此它不能执行您的第二个查询中的三个查询。

我建议将这些东西移到stored procedure中,并从PHP中调用它。

至于优化,设置这些变量的优化程度与查询所需的优化程度差不多。您需要对每一行进行比较,并且设置一个变量可以提供最快的访问下限和上限的时间。

对表的索引而不是查询本身的一个改进是将索引聚集在fecha_publicado周围,以允许MySQL智能地处理针对该范围值的查询。通过将fecha_publicado设置为表的主键,可以很容易地做到这一点。

票数 2
EN

Stack Overflow用户

发布于 2011-04-26 01:06:57

请确保在published.And上有索引,并确保正在使用它。

代码语言:javascript
运行
复制
EXPLAIN SELECT * FROM tbl_post WHERE published <  (UNIX_TIMESTAMP(NOW())-864000)  AND published> (UNIX_TIMESTAMP(NOW())-1728000)

这应该是一个很好的开始,看看查询中发生了什么。要添加索引,请执行以下操作:

代码语言:javascript
运行
复制
ALTER TABLE tbl_post ADD INDEX (published)
票数 3
EN

Stack Overflow用户

发布于 2011-04-26 01:05:39

需要检查的显而易见的事情是,在发布日期是否有索引,以及它是否正在使用?

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

https://stackoverflow.com/questions/5780789

复制
相关文章

相似问题

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