【发布时间】:2015-06-10 00:08:45
【问题描述】:
我有一个包含多个日期类型字段的 MySQL 数据库表。我需要对此表执行不同的 SELECT 查询,但我不确定哪种方法最适合查找同一个月的记录。
我知道我可以做到以下几点:
SELECT *
FROM table
WHERE MONTH(somedate) = 5
AND YEAR(somedate) = 2015
但我一直在阅读,效率不高,我应该使用实际日期,即
SELECT *
FROM table
WHERE somedate BETWEEN '2015-05-01' AND '2015-05-31'
但是,我所拥有的只是月份和年份作为来自 PHP 的变量。如果我选择第二个选项,如何轻松快速地计算当月的最后一天?
【问题讨论】:
-
我发现
between在我的数据库上比month/year和like慢。月/年 =Showing rows 0 - 29 (77 total, Query took 0.0825 sec)。之间 =Showing rows 0 - 29 (77 total, Query took 0.1059 sec)。喜欢 =Showing rows 0 - 29 (77 total, Query took 0.0815 sec)。这是在 7k 行表上。但是,该线程指向另一个方向。 dba.stackexchange.com/questions/96245/… -
MySQL 可以有效利用前导列为
somedate的索引。如果您没有这样的索引,那么您可以创建一个,例如CREATE INDEX ON table (somedate)。只要查询返回的行数少于表中的 10%,索引就会使查询速度更快。将函数包裹在 somedate 列上,MySQL 必须在表中的每一行上评估这些函数。 -
使用
EXPLAIN查看执行计划。对于性能比较,请确保查询结果不是从查询缓存返回的。有几种方法可以做到这一点,例如SQL_NO_CACHE命中,在查询中包含用户定义的变量,禁用查询缓存等(我们实际上将我们的 MySQL 服务器配置为缓存 only 查询,其中包括SQL_CACHE提示,因此我们控制可以缓存哪些查询,并防止结果被我们不需要缓存的查询刷新。)