MongoDB 索引:多个单字段与单个化合物?
MongoDB Indexing: Multiple single-field vs single compound?
我有一组地理空间+时间数据和一些附加属性,我将在地图上显示这些数据。该集合目前有几百万个文档,并且会随着时间的推移而增加。
每个文档都有以下字段:
- 位置:[geojson 对象]
- 日期:[日期对象]
- 缩放级别:[int32]
- 条目类型:[ObjectID]
我需要能够通过位置(通常是地理范围内查询)、日期(通常是 $gte/$lt)、ZoomLevel 和 EntryType 的任意组合来快速查询此集合。
我想知道的是:我应该制作一个包含所有四个字段的复合索引,还是每个字段一个索引,或者它们的某种组合?我在 MongoDB 文档中阅读了以下内容:
For a compound index that includes a 2dsphere index key along with
keys of other types, only the 2dsphere index field determines whether
the index references a document.
...这听起来好像意味着将 Location 的 2dsphere 索引作为复合索引的一部分可能毫无意义?
任何对此的澄清将不胜感激。
对于您的用例,您将需要使用多个索引。
如果您创建一个覆盖文档所有字段的索引,您的查询将只能在索引中包含第一个字段时使用它。
由于您需要通过这四个字段的任意组合进行查询,我建议您分析您的数据访问模式并准确查看您实际使用的过滤器并为每个过滤器或每个过滤器组创建特定索引。
编辑:对于你关于 2dsphere 的问题,将它们复合是有意义的。
此注释指的是 'sparse' 选项。稀疏索引仅引用包含索引字段的文档,对于 2dspheres,唯一将被遗漏的文档是不包含 geojson/point 数组的文档。
我有一组地理空间+时间数据和一些附加属性,我将在地图上显示这些数据。该集合目前有几百万个文档,并且会随着时间的推移而增加。
每个文档都有以下字段:
- 位置:[geojson 对象]
- 日期:[日期对象]
- 缩放级别:[int32]
- 条目类型:[ObjectID]
我需要能够通过位置(通常是地理范围内查询)、日期(通常是 $gte/$lt)、ZoomLevel 和 EntryType 的任意组合来快速查询此集合。
我想知道的是:我应该制作一个包含所有四个字段的复合索引,还是每个字段一个索引,或者它们的某种组合?我在 MongoDB 文档中阅读了以下内容:
For a compound index that includes a 2dsphere index key along with keys of other types, only the 2dsphere index field determines whether the index references a document.
...这听起来好像意味着将 Location 的 2dsphere 索引作为复合索引的一部分可能毫无意义?
任何对此的澄清将不胜感激。
对于您的用例,您将需要使用多个索引。
如果您创建一个覆盖文档所有字段的索引,您的查询将只能在索引中包含第一个字段时使用它。
由于您需要通过这四个字段的任意组合进行查询,我建议您分析您的数据访问模式并准确查看您实际使用的过滤器并为每个过滤器或每个过滤器组创建特定索引。
编辑:对于你关于 2dsphere 的问题,将它们复合是有意义的。
此注释指的是 'sparse' 选项。稀疏索引仅引用包含索引字段的文档,对于 2dspheres,唯一将被遗漏的文档是不包含 geojson/point 数组的文档。