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