2013-07-11 161 views
1

我有一个用于餐厅的mongo db集合。 例如 {_id:uniquemongoid, 排名:3, 城市: '柏林' }mongodb的索引

  1. 餐厅是由城市上市,并下令按职级(整数) - 我应该在城市排名上创建索引,或城市/等级组合? (我按城市查询并按排名排序)

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

+0

这一切都取决于你有多少数据和你的查询是什么。 – Thilo

+0

请注意,您可以使用光标的['explain()'方法](http://docs.mongodb.org/manual/reference/method/cursor.explain/)来检查用于完成查询的索引。因此,当您不确定给定索引是否有助于特定查询时,您可以尝试一下并检查。 – Philipp

+0

我的同事就此进行了一次演讲:http://www.youtube.com/watch?v = AVNjqgf7zNw他使用mysql作为示例,但适用相同的原则。也许它会帮助你设计你的索引。 – leif

回答

1

1)创建索引{餐厅:1,等级: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)要求,所以发布这个解决方案。
+0

查询将有城市,排名,布尔值,我应该创建一个索引与他们所有?我只有城市有更多的疑问,我应该创建2个索引? – LukeSolar

+0

因为索引大小很大,所以我不会推荐你使用'{city:1,rank:-1,info:1}'。另外我怀疑这个索引是否可以有效地用于获取排序结果数据(在'explain()'中检查'scanAndOrder')。关于第二个查询,如果我理解正确,它将不起作用,因为mongo永远不会对单个查询使用两个索引,即'{info:1}'和'{city:1,rank:-1}' 如果你没事的话与指数大小,你可以用第一种方法。 –

+0

我有大约10K家餐馆,我认为现在我会用第一种方法。但由于我们经常更新(排名),这可能会成为一个问题(除了索引大小),对吗? – LukeSolar

3

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

至于你的建议的指标:

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

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

+0

2)您是否同意Abhishek Kumar创建一个包含所有布尔值的字段并创建一个索引? – LukeSolar

+0

不,因为索引元素的数量仍然非常低。 – Derick