查询日期:" dateval LIKE' 2014-01-01%'"最佳做法?

时间:2014-02-10 11:53:35

标签: mysql sql datetime date-range query-performance

This回答建议使用大于/小于查询匹配给定日期的日期。但我公司的一位资深人士告诉我使用LIKE '2014-02-06%'

最佳做法是什么?一个人有没有明显的优势吗?

2 个答案:

答案 0 :(得分:5)

在此上下文中使用LIKE时,您(隐式且不可见)将DATE,TIMESTAMP或DATETIME列值类型转换为字符串,然后将字符串与您提到的模式进行比较。类型转换操作明确地无法使用列值上的任何索引。所有应用于WHERE子句中的列值的函数也是如此。

所以,你的同事得到的结果是正确的。但是他们比他们需要的慢得多,因为他们使用全表扫描而不是index range scan

顺便说一下,BETWEEN可以正常用于DATE列,但不适用于DATETIME或TIMESTAMP列。要从后两者中选择一天的日期,您需要

WHERE dateval >= '2014-02-06'
  AND dateval <  '2014-02-06' + INTERVAL 1 DAY

问题在于

WHERE dateval BETWEEN '2014-02-06'  /* wrong! */
                  AND '2014-02-06' + INTERVAL 1 DAY

在您想要的那天之后的当天午夜准确地获取日期值项目。两种配方都在索引上使用范围扫描,这使得它们很快。但BETWEEN可能会得到错误的结果。

答案 1 :(得分:2)

如果您在日期字段上使用LIKE进行查询,它将计算所有日期的日期的字符串表示,这不是一个好主意。但是如果使用BETWEEEN运算符,它只会将时间戳的int值与存储数据进行比较。