由于函数调用,SQL索引变慢

时间:2018-06-27 02:42:38

标签: sql algorithm indexing

有一个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胜出的用例。

如果可以的话,那是什么用例?

1 个答案:

答案 0 :(得分:4)

LIKE需要将日期转换为字符串。尽管该转换是隐式的,但它仍等效于一个函数调用,并且(通常)禁止使用索引。

类似地,MONTH()YEAR()是函数调用,它们阻止使用索引。

相反,只需写一个不等式:

SELECT t.*
FROM table t
WHERE datefield >= '2018-06-01' AND datefield < '2018-07-01'