我正在进行文字游戏,为此我有一个数据库表,大约有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个(因为与游戏其余部分相关的原因,这里不相关)。所以必须是ARTFC
或CFART
。现在,问题。
应用程序(PHP或Node.js)必须在MySQL数据库中搜索用户可能在字符串中键入的所有单词。首先它应该搜索5个字母的单词,然后如果它找不到它应该搜索4个字母的单词(如果用户键入ARTFC
它应该搜索ARTF
和{{1} })可能出现在5个字符的字符串中。如果它没有找到,3个字母的单词等。
这似乎有点慢。用户可以同时提交多达10个这样的5个字符的字符串,并且难以预测用户数量。那么,任何人都可以建议一种更好的方法来执行此搜索,而不是分割字符串并发送连续查询,直到我们在其中找到一个单词?
作为一个子问题,你认为InnoDB是比MyISAM更好的引擎选择吗?数据库表的唯一目的是搜索,不必写入任何内容。
答案 0 :(得分:0)
对于读取密集型任务,我会坚持使用 MyISAM mysql引擎。 至于表设计以获得更好的性能,您可以使用分区和SUBPARTITION创建单词字母 我是什么意思:
每个分区都有4个SUBPARTITION
完成所有这些操作后,请增加查询缓存大小,并参阅link了解如何