我有一个看起来像这样的模型:
{
_id: '...',
voice: '<dialect code>', // examples: 'en-US', 'en-GB', 'es', 'de', ...
text: '<plaintext up to 200 characters>',
... // other non-unique values
}
voice
&amp;text
应该是独特的值。我目前正在对这两个值进行查找,而不是进行文本搜索。在Mongoose中,一个示例查找就是这样:
SoundRequest.findOne({ voice: 'en-US', text: 'Hello, world' });
此查找目前需要几秒钟,而在重负荷下;没有索引,我对改善这里的性能非常感兴趣。
如何最好地在此集合中添加索引?我试图做一个复合索引,但是我遇到了一个错误WiredTigerIndex::insert: key too large to index
。我认为这是因为某些条目当前使用最多200个字符,并且比MongoDB的索引密钥长度限制大。
对我来说最好的选择是什么?我知道以下可能性:
- 设置
failIndexKeyTooLong: false
- 仅在
text
上使用Hashed索引 - 执行全文索引,尽管只需要查找精确匹配
- 仅在
voice
上添加索引(这甚至可以提高性能吗?) - 我自己的哈希吗?(哎呀)
是什么会给我最好的表现?这些选项中的任何一个甚至可以提高性能吗?
我目前坐在大约150万张记录中,并且数据库的性能随着时间的流逝而变得越来越糟,每个月的规模可能会增长约100万。
感谢@dnickless,我做了一些自己的调查。
我尝试的第一件事是在text
字段上进行哈希索引。在我的本地计算机上,有150万记录,在添加索引之前,平均查找约为600ms,然后 0ms 之后。
这对我来说是一个足够好的答案,而我现在在生产服务器上实施的答案没有问题。我还看到了同样的生产表现。
也许还有一个更好的答案,但这现在已经足够了。