如何在MySQL中优化搜索字典数据库

时间:2014-03-12 19:50:44

标签: mysql

我正在进行文字游戏,为此我有一个数据库表,大约有20000个英文单词,长度在2到5个字母之间。表结构很简单:

id | word  | length
1  | stuff | 5
2  | ask   | 3

所以单词长度有自己的专栏,我不确定这是否有用,但现在还有。

游戏原理涉及用户输入5个字母(由他指定)并尝试尽可能长地填写单词。例如,让我们说他有字母A,C,F,R,T。他必须输入全部5.所以他可以把单词CRAFT放在一起。或者,如果他没有想出那个,他可以看到RAFT这个词。如果他没有看到,也许他会看到ART。但是 - 在这种情况下他不能只输入3或4个字母,他必须输入全部5个(因为与游戏其余部分相关的原因,这里不相关)。所以必须是ARTFCCFART。现在,问题。

应用程序(PHP或Node.js)必须在MySQL数据库中搜索用户可能在字符串中键入的所有单词。首先它应该搜索5个字母的单词,然后如果它找不到它应该搜索4个字母的单词(如果用户键入ARTFC它应该搜索ARTF和{{1} })可能出现在5个字符的字符串中。如果它没有找到,3个字母的单词等。

这似乎有点慢。用户可以同时提交多达10个这样的5个字符的字符串,并且难以预测用户数量。那么,任何人都可以建议一种更好的方法来执行此搜索,而不是分割字符串并发送连续查询,直到我们在其中找到一个单词?

作为一个子问题,你认为InnoDB是比MyISAM更好的引擎选择吗?数据库表的唯一目的是搜索,不必写入任何内容。

1 个答案:

答案 0 :(得分:0)

对于读取密集型任务,我会坚持使用 MyISAM mysql引擎。  至于表设计以获得更好的性能,您可以使用分区和SUBPARTITION创建单词字母  我是什么意思:

  • 您将获得最多26个字母 - 这意味着您将拥有26个分区
  • 每个分区都有4个SUBPARTITION

    • 一个用于2个字母的单词
    • 一个用于3个字母的单词
    • 一个用于4个字母的单词
    • 一个用于5个字母的单词

完成所有这些操作后,请增加查询缓存大小,并参阅link了解如何