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

Lui*_*Sep 5 mysql sql datetime date-range query-performance

答案建议使用大于/小于查询匹配给定日期的日期.但是我公司的一位老兵告诉我要用LIKE '2014-02-06%'.

什么是最佳做法?一个比另一个有什么显着优势吗?

O. *_*nes 5

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

所以,你的同事得到的结果是正确的.但是它们比它们需要的慢得多,因为它们使用全表扫描而不是索引范围扫描.

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

WHERE dateval >= '2014-02-06'
  AND dateval <  '2014-02-06' + INTERVAL 1 DAY
Run Code Online (Sandbox Code Playgroud)

问题是

WHERE dateval BETWEEN '2014-02-06'  /* wrong! */
                  AND '2014-02-06' + INTERVAL 1 DAY
Run Code Online (Sandbox Code Playgroud)

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