【问题标题】:Mongodb is query is too slow for partial field search on the indexed fieldsMongodb 对索引字段的部分字段搜索查询太慢
【发布时间】:2017-12-18 15:31:27
【问题描述】:

我有以下 8 亿个文档的 mongodb 文档。

Customer
  {
   "lastName" : "LAST",
   "firstName" : "FIRST"
  }

我有以下索引

db.customer.createIndex( {lastName: 1, firstName: 1},{collation: { locale: "en_US", strength: 1}})

如果我根据 lastName 和 firstName 进行搜索,那么它会很快并在 10 毫秒内得到结果。

 db.customer.find({lastName:"LAST" ,firstName:"FIRST"}).collation({ locale: 'en_US', strength: 1 })

我正在尝试查找以“AS”作为姓氏字符的所有文档。但它需要超过 100 秒才能返回响应。我尝试了以下选项,但都花费了 100 多秒。 mongoDB真的不喜欢sql之类的操作吗('%AS%')

1)

db.customer.find({lastName:{"$regex": "AS"} ,firstName:"FIRST"}).collation({ locale: 'en_US', strength: 1 })

2)

db.customer.find({lastName:{"$regex": "/AS/"} ,firstName:"FIRST"}).collation({ locale: 'en_US', strength: 1 })

3)

db.customer.find({lastName:{"$regex": "^/AS/"} ,firstName:"FIRST"}).collation({ locale: 'en_US', strength: 1 })

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    尝试在你的正则表达式上使用前缀以允许 MongoDB 使用范围

    db.customer.find({lastName:{"$regex": "/^AS/"} ,firstName:"FIRST"}).collation({ locale: 'en_US', strength: 1 })

    如果正则表达式以插入符号 (^) 或左锚 (\A) 开头,后跟一串简单符号,则它是“前缀表达式”。例如,正则表达式 /^abc./ 将通过仅匹配索引中以 abc 开头的值进行优化。 此外,虽然 /^a/、/^a./ 和 /^a.$/ 匹配等效字符串,但它们具有不同的性能特征。如果存在适当的索引,则所有这些表达式都使用索引;但是,/^a./ 和 /^a.*$/ 速度较慢。 /^a/ 匹配前缀后可以停止扫描。

    regex

    【讨论】:

    • 嗨,您的建议与我的原始帖子中的查询相同(案例 3)。它需要同样的 100 秒。
    • 好吧,我把小屋 ^ 放在你放在外面的图案里面。无论如何,如果这无助于尝试为每个文件创建不同的索引而不是合并索引
    猜你喜欢
    • 2016-07-10
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多