MongoDB OR与正则表达式不使用复合索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB OR与正则表达式不使用复合索引相关的知识,希望对你有一定的参考价值。

真的在智慧结束;我正在使用以下查询来搜索大约300K文档的集合

query = { $or: [
  {description: { $regex: ".*app.*"}},
  {username: { $regex: ".*app.*"}}, 
]};

并简单地将其放在.find()函数中。它非常慢。像每个查询至少需要20秒。

我已经在用户名和描述上尝试了单独的索引,现在在{description:1,username:1}上有一个复合索引,但它似乎没有任何区别。如果我检查MongoDB实时指标,它根本不使用索引。

任何指针都将非常感激。

答案

使用部分字符串匹配的正则表达式从不使用索引,因为顾名思义,对于部分字符串匹配,它不知道从哪里开始查找匹配,并且必须遍历所有字符串。

作为一种解决方案,您可以将数据库挂钩到像Lucene这样的专门用于此类查询的东西。

以上是关于MongoDB OR与正则表达式不使用复合索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 唯一索引与复合索引

带有索引字段的 MongoDB 正则表达式

MongoDB 一个复合索引与多个单字段索引

MongoDB 复合索引与单字段索引在空间消耗方面的对比

MongoDB,通过正则表达式对索引字段的查询性能

自定义 MongoDB 对象 _id 与复合索引