mysql中的instr()能从索引中获益吗?

knpiaxh1  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(595)

我有一个用户表,用于测试:

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

我需要执行非常高性能的查询,当有人正在键入搜索用户时,这些查询会做出响应。通常人们会使用like%string%策略,但我负担不起,因为用户表有数百万行。
我在(用户名、名称)上创建了全文索引,但似乎全文索引不支持子字符串查询。
看来我最后的办法是使用instr()。任何一种列索引对instr()函数都有好处吗?
查询示例:
“j”,“wesome”,“96”,“k”

jm2pwxwz

jm2pwxwz1#

函数和运算符的使用几乎总是排除了索引的使用。 INSTR() 绝对属于那一类。 LIKE 使用常量模式并且模式开头没有通配符是个例外。
如果您需要处理这样的场景,您可以研究其他具有更广泛索引功能的数据库(尤其是postgres),包括可以帮助进行部分字符串匹配的索引。
您还可以通过使用n-grams在mysql中实现类似的功能。然而,这将需要一个单独的数据结构和一点复杂性。
您还可以使用全文索引来实现这一点,但需要在输入时对数据进行munging。例如,可以提取相邻的三个字母组合并将它们添加到索引中,因此:

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

相关问题