在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 } );
这是正确的方法还是有更好的方法?
答案 0 :(得分:1)
是的,复合指数可能是要走的路。有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-CompoundIndexes。
我在这里看到的唯一问题是你在索引中有很多字段会使它相当大,所以你可能只希望在具有高基数的字段上有索引。使用explain()来优化它。
另外,根据您的数据集,可能很难保持索引正确平衡(因此当它耗尽物理内存时它将开始击中磁盘),这将大大减慢速度。