有一个SO问题Error matching dates in PDO,我回答了这个问题,并进行了一些交谈。
基本上我说过不要在日期上使用通配符:
SELECT * FROM table where datefiled LIKE '%2018-06%'
而是使用类似的方法(是,两者之间也可以):
SELECT * FROM table where MONTH(datefield) = '06' and YEAR(datefield) = '2018
这导致我对我的回答发表评论,说他被告知(有9000万行数据):
在列上应用函数时,它将使索引的查找无效,因为它必须对索引中的所有值应用相同的函数,因此效率甚至更低。因此,需要使用带有日期边界的技巧。
我对SQL实现的搜索算法的理解不是很好,但是我知道何时使用和不使用索引(读取还是写入)。上面的内容似乎暗示着使用MONTH()
和YEAR()
函数的效率要比字符串LIKE
差。如果评论是关于BETWEEN
的,那么我可以理解,但是我无法设想由于函数调用而使LIKE
胜出的用例。
如果可以的话,那是什么用例?
答案 0 :(得分:4)
LIKE
需要将日期转换为字符串。尽管该转换是隐式的,但它仍等效于一个函数调用,并且(通常)禁止使用索引。
类似地,MONTH()
和YEAR()
是函数调用,它们阻止使用索引。
相反,只需写一个不等式:
SELECT t.*
FROM table t
WHERE datefield >= '2018-06-01' AND datefield < '2018-07-01'