在MySQL中,有多种方法可以比较日期(DATE和DATETIME字段)。我问我在不同的选项上是否有优点或缺点(性能,查询解析器,人类可读性......)。
以下是一些变体,我知道(我认为还有更多......):
SELECT my_date = 20140101
SELECT my_date = "2014-01-01"
SELECT DATE(my_datetime) = 20140101
SELECT YEAR(my_datetime) = 2014 AND MONTH(my_datetime) = 1 AND DAY(my_datetime) = 1
SELECT my_datetime BETWEEN "2014-01-01" AND "2014-01-01 23:59:59"
还有更多可能吗?
我认为,使用日期函数(DATE,YEAR,MONTH,DAY)的比较非常无效,因为查询优化器无法使用索引。
答案 0 :(得分:1)
是的,所有使用功能评估的变体都可能比其他解决方案慢。 (虽然有些人可能会被优化器加速,但是使用MySQL我不会指望它。)
我不希望第一个和第二个变体之间存在性能差异。可以将DATETIME
和TIMESTAMP
区分为列的类型。
TIMESTAMP
自所有unix时间戳(1970 ...)的零时起存储在几秒钟内,因此在搜索数据库之前,需要转换两个值。
DATETIME
值以与第一个变体类似的格式存储为整数,因此这可能比第二个变体略快,但由于您没有在那里构造动态值,因此字符串将在执行开始时被转换一次,因此开销很可能是微不足道的。
您可以阅读MySQL manual中的内部结构。
实际上你的陈述并不具有可比性。
假设列的类型为DATETIME
,那两个查询
SELECT my_date = 20140101
SELECT my_date = "2014-01-01"
会找到2014-01-01 00:00:00
的列,但不会找到2014-01-01 23:59:59
。
其他三个查询会找到两行。
从最后三个查询中,两个使用函数,因此不可取。从using BETWEEN for datetime column types is not that good from a semantics point of view开始(尤其是在MySQL 5.6.4中引入小数秒后),我很可能会选择这个查询:
SELECT * FROM TEST WHERE
my_datetime >= "2014-01-01" AND my_datetime < "2014-01-02"