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'
我有一个用户 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'