问题描述
|
在MongoDB中,我正在对包含约350万个对象的集合进行geonear查询,以返回某个纬度/经度附近的结果。如果我在对象上有一个基本的2d索引,则此查询运行良好:
db.Listing.ensureIndex( { Coordinates: \"2d\" } );
但是现在我也想按geonear查询中的其他字段(价格,属性类型,建成年份,床,浴室等...)进行过滤。当我向查询添加价格<= 10000000之类的东西时,查询开始变慢。我在这些其他字段上没有任何索引,因此我想知道哪种方法是性能最佳的。
我尝试为每个其他字段添加单独的索引(集合中共有11个索引),但是这每次都会使查询超时,我想是因为一个集合只能处理这么多的索引?
db.Listing.ensureIndex( { Coordinates: \"2d\" } );
db.Listing.ensureIndex( { Price: 1 } );
db.Listing.ensureIndex( { beds: 1 } );
db.Listing.ensureIndex( { Baths: 1 } );
etc...
现在,我正在考虑这样的集合只有1个复合索引:
db.Listing.ensureIndex( { Coordinates: \"2d\",Price: 1,PropertyType: 1,YearBuilt: 1,beds: 1,Baths: 1,HouseSize: 1,LotSize: 1,Stories: 1 } );
这是正确的方法还是有更好的方法?
解决方法
是的,复合索引可能是要走的路。有关详细信息,请参见http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-CompoundIndexes。
我在这里看到的唯一问题是该索引中有很多字段,这会使它变得很大,因此您可能只想在基数较高的字段上使用索引。使用describe()对此进行优化。
同样,给定数据集,可能很难保持索引正确平衡(因此,当物理内存用尽时它将开始击中磁盘),这将大大降低速度。