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

问题描述

| 在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()对此进行优化。 同样,给定数据集,可能很难保持索引正确平衡(因此,当物理内存用尽时它将开始击中磁盘),这将大大降低速度。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...