mongodb的索引

时间:2013-07-11 10:27:59

标签: performance mongodb indexing

我有一个餐馆的mongo db集合。 例如 {_id:uniquemongoid, 等级:3, 城市:'柏林' }

  1. 餐馆按城市列出并按等级排序(整数) - 我应该在城市和等级或城市/等级化合物上创建索引吗? (我按城市查询并按等级排序)

  2. 此外,有几个字段有布尔语,例如{hasParking:true,familyFriendly:true} - 我应该创建索引来加速这些过滤器的查询吗?复合指数?我不清楚我是否应该创建复合索引,因为查询只能设置一个布尔值或更多的布尔值。

2 个答案:

答案 0 :(得分:4)

确定是否需要索引的最佳方法是使用“explain()”对其进行基准测试。

至于建议的索引:

  1. 您需要城市/等级复合索引。 MongoDB中的索引只能用于从左到右(此时),因此对“city”进行相等搜索,然后按“rank”排序结果将意味着{ city: 1, rank: -1 }索引最有效

  2. 布尔字段的索引通常不是很有用,因为平均而言MongoDB仍然需要访问一半的文档。在按城市进行选择(并希望有限制!)为hasParking等做一个额外的过滤器使MongoDB同时使用city / rank和hasParking索引。 MongoDB每个查询只能使用一个索引。

答案 1 :(得分:1)

1)创建索引{restaurant:1,rank:1},这将符合您的目的。

您将避免使用2个索引

2)以下列格式创建文档,您可以查询所需的任何字段。

{
    info: [{hasParking:true}, {familyFriendly:true}],
    _id:
    rank:
    city:
}
db.restaurants.ensureIndex({info : 1});
db.restaurants.find({ info :{ hasParking:true}})
  • 注意MongoDB不对同一查询使用两个索引($或查询除外)。因此,在(2)情况下,如果要在(1)查询上添加附加过滤器,则此(2)选项将不起作用。我不确定你的(2)要求,所以发布这个解决方案。