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

MongoDB是否将低基数字段添加到复合索引?,mongodb,mongodb-indexes,compound-index,Mongodb,Mongodb Indexes,Compound Index,我认为将索引放在低基数字段上是没有意义的。 对于这样的复合索引,这是否成立: 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"}); 不同的对象

我认为将索引放在低基数字段上是没有意义的。 对于这样的复合索引,这是否成立:

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"});
不同的
对象类型的数量会随着时间的推移而增加(可能最多不超过10或20个),但开始时只有大约2或3个

同样,散列索引是否值得研究

更新


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

我可能无法回答您的问题,但我对索引基数表示感谢:

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

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

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

    我刚刚发布了一个答案,其中包含一些有关
    基数的材料,可能会对您有所帮助。此外,不能创建具有散列索引字段的复合索引。这不是毫无意义的,只是…嗯,小心点(和任何DB一样)。不要将它们放在复合树(索引)的顶层。至于你的索引:你有多少个
    target
    值?文档的总体大小是多少?如果文档总体上足够小,那么最好省去一个字段,并加快查询速度。很抱歉,重复注释,但第一个链接已经过时了。好像是写给MongoDB1.8的