MySQL 中的 INSTR() 可以从索引中受益吗?

Can INSTR() in MySQL benefit from an index?

我有一个用户 table 看起来像这样进行测试:

USER
----------------------------------
id   username           name
1    "djangoIsAwesome"  "Ale"
2    "craze123"         "John"
3    "hope this works"  "JJ"
4    "Rage"             "Ludo"
5    "coolguy1996"      "Frank"

我需要执行极其高效的查询,以便在有人键入搜索用户时做出响应。通常人们会使用 LIKE %string% 策略,但我在这里负担不起,因为 USER table 有数百万行。

我在 (username, name) 上创建了全文索引,但似乎全文索引不支持 substring 查询。

看来我最后的办法是使用 INSTR()。任何类型的列索引都会使 INSTR() 函数受益吗?

示例查询:

"J", "wesome", "96", "k"

函数和运算符的使用几乎总是排除索引的使用。 INSTR() 绝对属于该类别。 LIKE 具有常量模式且模式开头没有通配符是例外。

如果您需要处理此类情况,您可以研究具有更广泛索引功能的其他数据库(尤其是 Postgres)——包括有助于部分字符串匹配的索引。

您还可以使用 n-gram 实现 MySQL 中的类似功能。但是,这将需要一个单独的数据结构并且有点复杂。

您也可以使用全文索引来实现这一点——但要在输入时修改数据。例如,您可能会提取相邻的三个字母组合并将它们添加到索引中,因此:

'Frank' --> 'Frank Fra ran ank'