一尘不染

为什么列上的函数会阻止索引的使用?

sql

关于前几天我问的这个问题,我得到了以下评论。

在几乎所有数据库中,列上的几乎所有函数都会阻止使用索引。到处都有例外,但总的来说,函数会阻止使用索引

我四处搜寻,并发现了更多关于此相同行为的提及,但我很难找到比评论已经告诉我的更深入的信息。

有人可以详细说明为什么会发生这种情况,以及避免这种情况的对策吗?


阅读 327

收藏
2021-03-08

共1个答案

一尘不染

最基本形式的索引只是排序的列数据,因此可以轻松地按某个值查找。例如,一本教科书可以按一定顺序排列页面,但后面的所有术语都有一个索引。如您所见,数据已预先计算/排序并存储在单独的区域中。

当您将函数应用于列并尝试根据输出进行匹配/过滤时,索引不再有用。让我们再次看一下我们的书籍示例,并说我们正在应用的函数与术语相反(因此reverse('integral')变为'largetni')。您不会在索引中找到此值,因此您必须将所有术语取整,然后将它们放入函数中,然后再进行比较。全部在查询时。本来我们可以跳过搜索i,然后in,再int等等,因此很容易找到长期如此功能使一切慢得多。

如果您经常使用此功能进行查询,则可以reverse(term)提前创建索引以加快查找速度。但是,如果没有明确地这样做,它将总是很慢。

2021-03-08