MongoDB向复合索引添加低基数字段?

Posted

技术标签:

【中文标题】MongoDB向复合索引添加低基数字段?【英文标题】:MongoDB add fields of low cardinality to compound indexes? 【发布时间】:2016-02-06 14:43:56 【问题描述】:

我 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 的组合可能包含数千个类型分布均匀的条目。

【问题讨论】:

我刚刚在cardinality 上发布了一个包含一些材料的答案,可能会对您有所帮助。 Index Cardinality 另外,您不能创建具有散列索引字段的复合索引。 docs.mongodb.org/manual/core/index-compound/… 这不是毫无意义的,它只是......好吧,小心(与任何数据库相同)。不要将它们作为复合树(索引)的顶层。至于你的索引:你有多少target 值? 另外,文档的整体大小是多少?如果文档整体足够小,最好保留一个字段并加快查询速度 很抱歉重复了 cmets,但第一个链接已经过时了。似乎它是针对 MongoDB 1.8 编写的 【参考方案1】:

我可能无法回答你的问题,但为了索引基数,我会付出我的代价:

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

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

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

【讨论】:

以上是关于MongoDB向复合索引添加低基数字段?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB索引问题

MongoDB - 唯一索引与复合索引

MongoDB 复合索引与单字段索引在空间消耗方面的对比

MongoDB Find 性能:单个复合索引 VS 两个单字段索引

深入理解MongoDB的复合索引

MongoDB + C#:未选择/使用 GUID 字段上的复合索引