我有一个餐馆的mongo db集合。 例如 {_id:uniquemongoid, 等级:3, 城市:'柏林' }
餐馆按城市列出并按等级排序(整数) - 我应该在城市和等级或城市/等级化合物上创建索引吗? (我按城市查询并按等级排序)
此外,有几个字段有布尔语,例如{hasParking:true,familyFriendly:true} - 我应该创建索引来加速这些过滤器的查询吗?复合指数?我不清楚我是否应该创建复合索引,因为查询只能设置一个布尔值或更多的布尔值。
答案 0 :(得分:4)
确定是否需要索引的最佳方法是使用“explain()”对其进行基准测试。
至于建议的索引:
您需要城市/等级复合索引。 MongoDB中的索引只能用于从左到右(此时),因此对“city”进行相等搜索,然后按“rank”排序结果将意味着{ city: 1, rank: -1 }
索引最有效
布尔字段的索引通常不是很有用,因为平均而言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}})