可以在MongoDB中搜索单个字段时使用复合索引吗?

时间:2014-03-13 11:10:29

标签: mongodb indexing

如果我创建以下复合索引:

{'username': 1, 'uid': 1}

如果我只使用uid搜索,可以使用此索引 db.users.find({'uid': '12345'})

因为生成两个单独的单个索引似乎使用更多内存。

4 个答案:

答案 0 :(得分:3)

只要您通过作为索引字段左侧子集的字段进行查询,MongoDB就会自动使用索引。也就是说,如果你有一个像{a:1,b:1,c:1}这样的索引,那么所有3个查询都是db.coll.find({a:" xxx"}),db.coll .find({a:" xxx",b:" yyy"})和db.coll.find({a:" xxx",b:&# 34; yyy",c:" zzz"})将使用此索引,假设没有其他索引。

答案 1 :(得分:1)

但是,可以使用hint(),默认情况下优化器不会选择此索引,因为它按前缀搜索,而uid不是{username, uid}的前缀。

至于在搜索时使用索引,它会扫描所有username值,然后在每个用户名中扫描uid

这有时可能是一件好事,特别是如果您希望按uid对这些username值进行排序,因为scanandorder将为false,但如果您不期望按username字段排序,你会发现它可能会有点不合格。

答案 2 :(得分:0)

答案是否定的,当您通过uid查找时,mongo将不会使用此复合索引。

当您尝试按用户名或按用户名和uid对查找时,将使用您的索引。 它在mongo文档中有很好的描述: https://docs.mongodb.com/manual/core/index-compound/#prefixes

如果您希望通过uid而不是用户名进行搜索,则应在复合索引中切换顺序。

如果您不同时按用户名和uid搜索,最好的选择是删除此复合索引并创建两个单独的索引。

答案 3 :(得分:0)

如果您的索引:{a:1,b:1,c:1}。

然后,它将适用于以下条件:

db.coll.find({a:'xxx'})
db.coll.find({b:'yyyy'})
db.coll.find({c:'zzz'})
db.coll.find({a:'xxx',c:'zzz'})
db.coll.find({a:'xxx',b:'yyy'})
db.coll.find({a:'xxx',b:'yyy',c:'zzz'})
db.coll.find({b:'yyy',a:'xxx',c:'zzz'})
db.coll.find({b:'yyy',c:'zzz',a:'xxx'})

它在以下情况下不起作用:

db.coll.find({b:'yyy',c:'zzz'})
db.coll.find({b:'yyy'})
db.coll.find({c:'zzz'})

仅当您的索引前缀在您的搜索查询中时,索引才有效。顺序无关紧要。