首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使查询更高效

问使查询更高效
EN

Stack Overflow用户
提问于 2012-03-21 07:36:05
回答 5查看 87关注 0票数 0

假设我有以下SQL查询

代码语言:javascript
复制
SELECT id, name, title, description, time 
  FROM entity 
  WHERE UNIXTIMESTAMP(CONCAT(date_end, time_end)) > UNIXTIMESTAMP(NOW()) 
    AND UNIXTIMESTAMP(CONCAT(next_date, next_time)) < UNIXTIMESTAMP(NOW())

我正在研究视图和其他方法,以提高查询的效率。问题是,如果我有超过10,000个实体要处理,那么查询可能会花费很长时间。

MySQL提供了哪些工具来提高上述查询的效率?谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-03-21 07:43:44

如果您只是想了解一般技术,那么这个主题上已经有很多问题了,更不用说optimization上的MySQL手册部分了。

如果您要为查询提供特定的建议,请注意,如果列通过函数传递,则MySQL不能应用索引。您需要删除*_end和next_*列周围的UNIXTIMESTAMP和CONCAT调用。一种方法是更改表模式:将列合并为DATETIME或TIMESTAMP类型的"end“和"next”列。另一种方法是将当前时间分离为日期和时间,并使用该日期和时间分别与列进行比较。

票数 4
EN

Stack Overflow用户

发布于 2012-03-21 07:50:30

您的查询只需要处理10k条记录就可以了,但这应该会更有效率,因为它不涉及任何类型转换。

代码语言:javascript
复制
SELECT id, name, title, description, time 
FROM entity 
WHERE (date_end > CURRENT_DATE OR (date_end = CURRENT_DATE AND time_end >= CURRENT_TIME))
AND (next_date < CURRENT_DATE OR (next_date = CURRENT_DATE AND next_time <= CURRENT_TIME))

(next_date,date_end)上的复合索引也应该有助于提高性能,但是如果您使用EXPLAIN来检查执行计划,那么它应该有助于您决定最有效的索引。你也应该检查一下(date_end,next_date)上的索引。如果不对数据的分布有更多的了解,就不可能说出哪一个最有帮助。

票数 2
EN

Stack Overflow用户

发布于 2012-03-21 07:42:52

请看一下explain -它会告诉你引擎盖下发生了什么。

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

https://stackoverflow.com/questions/9796626

复制
相关文章

相似问题

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