优化 MySQL 表以进行子字符串搜索(单字记录 - 字典)



如何优化包含大约 100 万条记录的 MySQL 表以进行子字符串搜索(%xxx、xx%, %xxx%)?所有记录仅包含一个单词(平均 11 个字符,最多 41 个字符)。

我知道像%xxx这样的查询是有问题的,但我看不到任何方法可以避免它。

所以问题是:有没有办法帮助MySQL最大限度地减少这些查询的工作量?或者有没有其他方法可以以不同的方式查询此类数据以利用某些索引?

可用技术:MySQL,PHP,Javascript(MySQL和PHP是商业使用的,因此无法重新配置特定方式)。

背景:这是过去15年来用我的母语写的文学作品中使用的独特单词的"完整"列表。我想让用户有机会通过输入单词的一部分(任何部分)来找到所有相关单词。

不能使用标准 MySQL 索引进行子字符串匹配。除了前缀匹配之外,它不适用于任何内容。

你也许可以为这个词生成一个SOUNDEX(),但这可能不是你想要的。

您可以为每一行生成所有可能的子字符串,并将它们存储在另一个表中。这将是很多行(可能是5000万行),特别是如果您将单个字符作为子字符串(编辑:见下文)

之后,您可以尝试寻找一个自由文本匹配库,该库进行模糊匹配以插入您的应用程序。我不知道PHP中的任何事情。FREJ是Java中的东西。

快速和肮脏的解决方案:

1M 行 * 11 个字符 = 22MB 内存(即无内存)。

将其加载到内存中并扫描。

编辑:按照建议,您可以将子字符串和索引存储到字符串的末尾,然后使用前缀匹配返回候选集。这将只需要每个单词 n 个索引条目,其中 n 是单词长度。

为了真正有效地利用存储,您需要研究使用 n 元语法 N 元语法的高级技术

最新更新