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上使用Hashed索引
  3. 执行全文索引,尽管只需要查找精确匹配
  4. 仅在voice上添加索引(这甚至可以提高性能吗?)
  5. 我自己的哈希吗?(哎呀)

是什么会给我最好的表现?这些选项中的任何一个甚至可以提高性能吗?

我目前坐在大约150万张记录中,并且数据库的性能随着时间的流逝而变得越来越糟,每个月的规模可能会增长约100万。

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

我尝试的第一件事是在text字段上进行哈希索引。在我的本地计算机上,有150万记录,在添加索引之前,平均查找约为600ms,然后 0ms 之后。

这对我来说是一个足够好的答案,而我现在在生产服务器上实施的答案没有问题。我还看到了同样的生产表现。

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

最新更新