MySQL中日期比较的不同方式

时间:2014-03-06 10:06:04

标签: mysql performance date

在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)的比较非常无效,因为查询优化器无法使用索引。

1 个答案:

答案 0 :(得分:1)

从纯技术角度来看

是的,所有使用功能评估的变体都可能比其他解决方案慢。 (虽然有些人可能会被优化器加速,但是使用MySQL我不会指望它。)

我不希望第一个和第二个变体之间存在性能差异。可以将DATETIMETIMESTAMP区分为列的类型。

  • 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"