如何在mongodb中为以下查询编制索引?
我正试图找出在mongodb中用于此目的的最佳索引:如何在mongodb中为以下查询编制索引?,mongodb,indexing,Mongodb,Indexing,我正试图找出在mongodb中用于此目的的最佳索引: db.articles.find({"images.url":{"$exists":true}, \ "source_id": {"$in":[ObjectId("511baf3aa56bde8e94000002"), ObjectId("511baf3aa56bde8e94000999")]}}) \ .sort({"published_at": -1}) 我只想包含images.url存在的文章,所以我想知道它是否
db.articles.find({"images.url":{"$exists":true}, \
"source_id": {"$in":[ObjectId("511baf3aa56bde8e94000002"), ObjectId("511baf3aa56bde8e94000999")]}}) \
.sort({"published_at": -1})
我只想包含images.url存在的文章,所以我想知道它是否是一个稀疏索引?并且不确定要按顺序索引哪些字段,因为我已经阅读了以下不同的指针:
index "images.url": -1, published_at: -1, source_id: 1, {sparse: true}
但我也对指数的排他性最大化感到困惑,因此我正在考虑:
index source_id: 1, "images.url": -1, published_at: -1, {sparse: true}
如果我们有这样的收藏
{ a:1, b:1, c:1 }
{ a:1, b:1, c:2 }
{ a:1, b:1, c:3 }
{ a:1, b:2, c:1 }
... // all permutations up to:
{ a:3, b:3, c:3 }
想象一下这个集合是按随机顺序排列的
这就是({a:1,b:1,c:1})上的复合索引的样子
a: | 1 | 2 | 3 |
|-----------------+-----------------+-----------------|
b: | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 |
|-----+-----+-----+-----+-----+-----+-----+-----+-----|
c: |1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|
每一个a都有它的b和c,好吗
对于查询:db.xx.find({a:2}).sort({b:1}),您可以看到b元素在a=2下面按顺序排列;该索引将用于对explain()中的“scanander”进行排序:false。如果您的查询是db.xx.find({a:2,c:{$in:[1,3]})。sort({b:1})
但是这:db.xx.find({a:{$in:[1,3]}).sort({b:1}).explain()将告诉您“scanander”:true,这意味着索引没有用于排序(不过它用于查询)——从上面的模式可以看出,“b”不是a=[1,3]的顺序
这就是为什么索引的有效顺序是:
(1) exact matches (only one!)
(2) sort criteria
(3) matches that point to more than one document
在你的情况下,没有确切的匹配;两个查询都返回多个文档。让我们在我们的示例中尝试一下:
db.xx.find({a:{$in:[1,3]},b:{$in:[1,3]})。sort({c:1})。explain():使用索引进行查询,但不用于排序,它扫描15个对象并返回12个对象
db.xx.find({b:{$in:[1,3]},c:{$in:[1,3]})。sort({a:1})。explain():使用索引进行查询和排序,但扫描21个对象并返回12个对象
哪一个更好?这将取决于您的用例。如果您的查找通常返回许多文档,那么让排序使用索引可能会更有效-但是如果它通常只返回少数文档(在许多文档中),那么您可能更喜欢更高效的扫描。尝试一下,看看使用explain()有什么更好的方法
这有用吗
问候
罗纳德
另外,我用它创建了示例集合:
[1,2,3].forEach(function(a){
[1,2,3].forEach(function(b){
[1,2,3].forEach(function(c){
db.xx.insert({a:a,b:b,c:c});
})
})
})
如果我们有这样的收藏
{ a:1, b:1, c:1 }
{ a:1, b:1, c:2 }
{ a:1, b:1, c:3 }
{ a:1, b:2, c:1 }
... // all permutations up to:
{ a:3, b:3, c:3 }
想象一下这个集合是按随机顺序排列的
这就是({a:1,b:1,c:1})上的复合索引的样子
a: | 1 | 2 | 3 |
|-----------------+-----------------+-----------------|
b: | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 |
|-----+-----+-----+-----+-----+-----+-----+-----+-----|
c: |1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|1|2|3|
每一个a都有它的b和c,好吗
对于查询:db.xx.find({a:2}).sort({b:1}),您可以看到b元素在a=2下面按顺序排列;该索引将用于对explain()中的“scanander”进行排序:false。如果您的查询是db.xx.find({a:2,c:{$in:[1,3]})。sort({b:1})
但是这:db.xx.find({a:{$in:[1,3]}).sort({b:1}).explain()将告诉您“scanander”:true,这意味着索引没有用于排序(不过它用于查询)——从上面的模式可以看出,“b”不是a=[1,3]的顺序
这就是为什么索引的有效顺序是:
(1) exact matches (only one!)
(2) sort criteria
(3) matches that point to more than one document
在你的情况下,没有确切的匹配;两个查询都返回多个文档。让我们在我们的示例中尝试一下:
db.xx.find({a:{$in:[1,3]},b:{$in:[1,3]})。sort({c:1})。explain():使用索引进行查询,但不用于排序,它扫描15个对象并返回12个对象
db.xx.find({b:{$in:[1,3]},c:{$in:[1,3]})。sort({a:1})。explain():使用索引进行查询和排序,但扫描21个对象并返回12个对象
哪一个更好?这将取决于您的用例。如果您的查找通常返回许多文档,那么让排序使用索引可能会更有效-但是如果它通常只返回少数文档(在许多文档中),那么您可能更喜欢更高效的扫描。尝试一下,看看使用explain()有什么更好的方法
这有用吗
问候
罗纳德
另外,我用它创建了示例集合:
[1,2,3].forEach(function(a){
[1,2,3].forEach(function(b){
[1,2,3].forEach(function(c){
db.xx.insert({a:a,b:b,c:c});
})
})
})
一篇有一些视觉效果的好的相关博客文章:。一篇有一些视觉效果的好的相关博客文章:。