如何优化MySQL表,大约有100万条记录用于子字符串搜索(%xxx,xx%,%xxx%)?所有记录只包含一个单词(平均11个字符,最多41个字符)。
我知道查询LIKE%xxx是问题,但我没有看到任何方法如何避免它。
所以问题是:有没有办法帮助MySQL最大限度地减少这些查询的工作量?或者有没有其他方法如何以不同的方式查询这些数据以利用某些索引?
可用技术:MySQL,PHP,Javascript(MySQL和PHP在商业上使用,因此无法重新配置特定方式)。
背景:这是过去15年中用我的母语编写的文学中使用的独特单词的“完整”列表。我希望通过输入单词(任何部分)的一部分,让用户有机会找到所有相关单词。
答案 0 :(得分:1)
您无法使用标准MySQL索引进行子字符串匹配。除了前缀匹配之外,它不会工作。
您可以为该单词生成SOUNDEX()
,但这可能不是您想要的。
您可以为每一行生成所有可能的子字符串,并将它们存储在另一个表中。这将是很多行(可能是5000万),特别是如果你将单个字符包含在子串中(编辑:见下文)
之后,你可以尝试寻找一个模糊匹配的自由文本匹配库来插入你的应用程序。我不知道PHP中的任何内容。 FREJ是Java中的东西。
快速而肮脏的解决方案:
1M行* 11个字符= 22MB内存(即没有)。
将其加载到内存中并进行扫描。
编辑:如建议的那样,您可以将子字符串和索引存储到字符串的末尾,然后使用前缀匹配来返回候选集。这将只需要每个单词n个索引条目,其中n是单词长度。
为了真正有效地使用存储,您需要使用n-gram N-grams
来查看高级技术