MongoDB复合索引完全匹配的长文本

时间:2017-12-13 19:21:20

标签: mongodb

我的模型看起来像这样:

{
  _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的索引密钥长度限制大。

对我来说最好的选择是什么?我知道以下可能性:

  1. 设置failIndexKeyTooLong: false
  2. 仅在text
  3. 上使用散列索引
  4. 执行全文索引,尽管只需要查找完全匹配
  5. 仅在voice上添加一个索引(这会改善效果吗?)
  6. 做我自己的哈希? (哎哟)
  7. 什么会给我最好的表现?这些选项中的任何一个都能提高性能吗?

    我目前坐拥约150万条记录,随着时间的推移,数据库性能显着下降,每月的数量可能会增加约100万条记录。

1 个答案:

答案 0 :(得分:0)

感谢@dnickless,我做了一些自己的调查。

我尝试的第一件事是在text字段上执行散列索引。 在我的本地机器上,有1.5M记录,在添加索引之前平均查找时间约为600毫秒,之后 0ms

这对我来说是一个很好的答案,我现在已经在我的生产服务器上实现了一个没有问题的答案。我也看到了相同的生产性能提升。

也许还有更好的答案,但现在这已经足够了。