SQL索引因函数调用而变慢

SQL索引因函数调用而变慢,sql,algorithm,indexing,Sql,Algorithm,Indexing,有一个问题,我给出了答案,并进行了一些交谈 基本上,我说过在日期上不要使用通配符: SELECT * FROM table where datefiled LIKE '%2018-06%' 而是使用类似(是的,中间人也可以): 这导致对我的回答发表评论,称他被告知(数据+9000万行): 当您在列上应用函数时,它将避免使用索引进行查找,因为它必须对索引中的所有值应用相同的函数,因此效率甚至更低。因此,需要使用日期边界的技巧 我对SQL实现的搜索算法的理解不是很好,但我知道何时使用索引,何时不使

有一个问题,我给出了答案,并进行了一些交谈

基本上,我说过在日期上不要使用通配符:

SELECT * FROM table where datefiled LIKE '%2018-06%'
而是使用类似(是的,中间人也可以):

这导致对我的回答发表评论,称他被告知(数据+9000万行):

当您在列上应用函数时,它将避免使用索引进行查找,因为它必须对索引中的所有值应用相同的函数,因此效率甚至更低。因此,需要使用日期边界的技巧

我对SQL实现的搜索算法的理解不是很好,但我知道何时使用索引,何时不使用索引(读与写)。上面的内容似乎暗示使用
MONTH()
YEAR()
函数的效果不如使用类似的字符串
。如果注释是关于
BETWEEN
的,我会得到它,但我无法想象
LIKE
会因为函数调用而胜出的用例


如果可以,该用例是什么?

类似
要求将日期转换为字符串。尽管转换是隐式的,但它仍然相当于函数调用,并且(通常)防止使用索引

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

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

SELECT t.*
FROM table t
WHERE datefield >= '2018-06-01' AND datefield < '2018-07-01'
选择t*
来自表t
其中日期字段>='2018-06-01'和日期字段<'2018-07-01'

类似,需要将日期转换为字符串。尽管转换是隐式的,但它仍然相当于函数调用,并且(通常)防止使用索引

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

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

SELECT t.*
FROM table t
WHERE datefield >= '2018-06-01' AND datefield < '2018-07-01'
选择t*
来自表t
其中日期字段>='2018-06-01'和日期字段<'2018-07-01'

所以最后并不是说
LIKE
会比
YEAR()
MONTH()
表现更好,但不管怎样,股票都会比两者更快,因为SQL可以更有效地使用索引?我用
进行了一些测试,比如
年()
月()
相比,后者似乎效率更高。@nerdlyist。我很惊讶它会更高效,但是对日期部分的操作应该比模式匹配之类的
更快。我认为查询仍将读取所有行,这是性能的更大驱动因素。奇怪的是,
LIKE
返回空集,即使有匹配的数据,也需要几秒钟,而不是以毫秒为单位返回数据的部分。@nerdlyist。您尚未指定数据库。也许您的数据库足够聪明,可以为日期部分使用索引。因此,最终并不是说
LIKE
的性能优于
YEAR()
MONTH()
,但不管怎样,这种公平性都会比两者更快,因为SQL可以更有效地使用索引?我用
进行了一些测试,比如
年()
月()
相比,后者似乎效率更高。@nerdlyist。我很惊讶它会更高效,但是对日期部分的操作应该比模式匹配之类的
更快。我认为查询仍将读取所有行,这是性能的更大驱动因素。奇怪的是,
LIKE
返回空集,即使有匹配的数据,也需要几秒钟,而不是以毫秒为单位返回数据的部分。@nerdlyist。您尚未指定数据库。也许您的数据库足够聪明,可以为日期部分使用索引。