3

读过在低基数字段 放置索引是没有意义的。这对于这样的复合索引是否成立:

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"});

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

同样,哈希索引是否值得研究?

更新

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

4

1 回答 1

1

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

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

  1. 常规 - 对于我们放入索引的每个键,肯定会有一个索引点。此外,如果没有键,那么在空条目下会有一个索引点。就索引基数而言,我们得到相对于集合中文档数量的 1:1。这使得索引具有一定的大小。就其指向文档的结束指针而言,它与集合大小成正比
  2. 稀疏 - 当文档缺少被索引的键时,它不在索引中,因为它是空值,我们不会在稀疏索引的索引中保留空值。我们将拥有可能小于或等于文档数量的索引点。
  3. Multikey - 这是数组值的索引。每个文档都有多个索引点(对于数组的每个元素)。因此,它将大于文档的数量。

索引点数

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

于 2016-09-04T16:33:15.183 回答