2017-12-18 358 views
2

我有以下mongodb文件与800万文件。Mongodb查询速度太慢,部分字段搜索索引字段

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

如果我在10毫秒的基础上的lastName和名字,那么它的速度快,得到的结果与搜索我有以下指标

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

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

我正在尝试查找所有以“姓氏”作为姓氏中的字符的文档。但它需要超过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 }) 
的在你的正则表达式

回答

0

尝试使用前缀,使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

+0

你好,你的建议是相同的查询像在原来的职位(案例3)。它采取相同的100秒。 –

+0

好吧,我把小屋^放在你把它放在外面的模式里面。无论如何,如果这不帮助尝试为每个字段创建不同的索引,而不是合并索引 –