在geonear查询中对多个字段进行排序的最佳方法

时间:2011-05-26 00:20:53

标签: mongodb

在MongoDB中,我正在对包含~350万个对象的集合进行geonear查询,以返回接近某个纬度/经度的结果。如果我在对象上有一个基本的2d索引,那么这个查询运行得很好:

db.Listing.ensureIndex( { Coordinates: "2d" } );

但是现在我还希望在geonear查询中按其他字段(价格,房产类型,建成年份,床位,浴室等等)进行过滤。当我向查询中添加Price< = 10000000之类的内容时,查询开始变慢。我在这些其他领域没有任何索引,所以我想知道最好的方法是什么在性能方面。

我尝试为其他每个字段添加单独的索引(集合上总共有11个索引),但这会使查询每次都超时,我想因为集合只能处理这么多索引吗?

db.Listing.ensureIndex( { Coordinates: "2d" } );
db.Listing.ensureIndex( { Price: 1 } );
db.Listing.ensureIndex( { Beds: 1 } );
db.Listing.ensureIndex( { Baths: 1 } );
etc...

现在我想在集合上只有一个复合索引,如下所示:

db.Listing.ensureIndex( { Coordinates: "2d", Price: 1, PropertyType: 1, YearBuilt: 1, Beds: 1, Baths: 1, HouseSize: 1, LotSize: 1, Stories: 1 } );

这是正确的方法还是有更好的方法?

1 个答案:

答案 0 :(得分:1)

是的,复合指数可能是要走的路。有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-CompoundIndexes

我在这里看到的唯一问题是你在索引中有很多字段会使它相当大,所以你可能只希望在具有高基数的字段上有索引。使用explain()来优化它。

另外,根据您的数据集,可能很难保持索引正确平衡(因此当它耗尽物理内存时它将开始击中磁盘),这将大大减慢速度。