MongoDB将低基数字段添加到复合索引中?

时间:2015-11-05 16:40:19

标签: mongodb mongodb-indexes compound-index

have read将索引放在低基数字段上毫无意义。 这对于复合索引是否适用:

db.perms.createIndex({"owner": 1, "object_type": 1, "target": 1});

使用查询:

db.perms.find({"owner": "me", "object_type": "square"});
db.perms.find({"owner": "me", "object_type": "circle", "target": "you"});

不同object_type的数量会随着时间的推移而增长(最多可能不超过10或20),但最开始只有2或3个。

类似地,哈希索引值得研究吗?

更新

ownertarget将会大幅增长。可以把它想象成一个文件系统,其中owner将“拥有”一个target(即文件)。但是,与unix系统一样,文件可以是文件夹,符号链接或常规文件(因此类型)。因此,虽然只有3个object_type,但ownertarget组合可能会有数千个条目具有均匀分布的条目。

1 个答案:

答案 0 :(得分:1)

我可能无法回答你的问题,但是为索引基数提供我的分数:

索引基数:它指的是MongoDB支持的每种不同类型索引的索引点数。

  1. 常规 - 对于我们放入索引的每一个键,肯定会有一个索引点。此外,如果没有密钥,那么在null条目下将会有一个索引点。相对于索引基数方面的集合中的文档数,我们得到1:1。这使得索引具有一定的规模。根据文档的最终指针
  2. ,它与集合大小成正比
  3. 稀疏 - 当文档缺少被索引的键时,它不在索引中,因为它是null,并且我们不在索引中保留稀疏索引的空值。我们的索引点可能会小于或等于文档数量。
  4. Multikey - 这是数组值的索引。每个文档都有多个索引点(对于数组的每个元素)。因此,它将大于文件数量。
  5. number of index points

    假设您使用名为tags的密钥更新文档,并且该更新会导致文档需要在磁盘上移动。假设您正在使用MMAPv1存储引擎。如果文档中包含100个标记,并且如果使用多键索引对标记数组进行索引,则需要在索引中更新100个索引点以适应移动?