我的模型看起来像这样:
{
_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
voice
上添加一个索引(这会改善效果吗?)什么会给我最好的表现?这些选项中的任何一个都能提高性能吗?
我目前坐拥约150万条记录,随着时间的推移,数据库性能显着下降,每月的数量可能会增加约100万条记录。
答案 0 :(得分:0)
感谢@dnickless,我做了一些自己的调查。
我尝试的第一件事是在text
字段上执行散列索引。
在我的本地机器上,有1.5M记录,在添加索引之前平均查找时间约为600毫秒,之后 0ms 。
这对我来说是一个很好的答案,我现在已经在我的生产服务器上实现了一个没有问题的答案。我也看到了相同的生产性能提升。
也许还有更好的答案,但现在这已经足够了。