【发布时间】:2011-08-27 00:27:22
【问题描述】:
在 MySQL 5.1 InnoDB 环境中,根据日期间隔选择数据的最佳方法是什么?
让 MySQL 通过 DATE_SUB(CURDATE(), INTERVAL 5 DAY) > created_at 之类的方式来完成它
或者让PHP在提交前通过strtotime准备好日期?
【问题讨论】:
标签: php mysql optimization
在 MySQL 5.1 InnoDB 环境中,根据日期间隔选择数据的最佳方法是什么?
让 MySQL 通过 DATE_SUB(CURDATE(), INTERVAL 5 DAY) > created_at 之类的方式来完成它
或者让PHP在提交前通过strtotime准备好日期?
【问题讨论】:
标签: php mysql optimization
我会通过对 MySql 的查询来做到这一点。这样,您就可以在 PHP 之外保留选择日期的逻辑。 PHP 只处理显示,您还可以从数据库中获得较小数据块的优势。
【讨论】:
在这种情况下,从性能的角度来看,我认为这并不重要。您的表达式 (DATE_SUB) 将只计算一次。还有一点就是你的webserver和mysql server可以使用不同的时区,所以可能会有不同的结果。
【讨论】:
我会尽可能多地保留最接近数据库的逻辑 - 它有更多的能力进行任何优化。还可以更轻松地更改表,将来更改 PHP(可能是 java/C# ...)的使用。它还区分了 beteen 数据库(用于数据)、PHP(用于 HTML 交付)、Javascript(用于用户享受)、CSS(使事情变得漂亮)
【讨论】:
您可以使用BETWEEN ... AND ...选择日期范围
SELECT * FROM table1 t1 WHERE now() BETWEEN t1.startdate AND t1.enddate
或
SELECT * FROM table1 t1
WHERE t1.somedate BETWEEN DATE_SUB(now(),INTERVAL 1 DAY) AND now()
我更喜欢这种语法,因为它非常接近我心中的范围。
【讨论】: