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。您尚未指定数据库。也许您的数据库足够聪明,可以为日期部分使用索引。