MongoDB 一个复合索引与多个单字段索引

Posted

技术标签:

【中文标题】MongoDB 一个复合索引与多个单字段索引【英文标题】:MongoDB one compound index vs multiple single field indexes 【发布时间】:2012-11-16 07:11:43 【问题描述】:

我有一组照片。它们可以从其他一些集合(事件、新闻、帖子等)中引用(一对多)

我可以像这样创建参考:

db.photos.insert( parent: collection: 'events', id: 12345 )
db.photos.insert( parent: collection: 'events', id: 54321 )
//or just DBRef
db.photos.ensureIndex(parent:1)

db.photos.insert( post_id: 12345 )
db.photos.insert( event_id: 54321 )

db.photos.ensureIndex(post_id:1, sparse: true)
db.photos.ensureIndex(event_id:1, sparse: true)

在第一种情况下,我们有一个大的复合索引 第二个——一些较小的索引

每种方法的优缺点是什么?

【问题讨论】:

第一种情况是子文档索引,不是复合索引。请参阅文档here 以获得对差异的基本了解。询问每种方法的优缺点是一个过于宽泛的问题。 由于每张照片都可以从很多地方引用,您是否考虑过将照片 ID 存储在适当的事件集合中而不是照片集合中的事件?要了解哪个“更好”以及权衡取舍,您需要考虑如何查询此信息(因为架构和索引应根据您将使用的查询进行优化,而不是孤立的数据本身)。 基本上答案是:这取决于您的查询。 @JohnnyHK,谢谢,当然,我知道其中的区别。只是把它弄混了,因为我也在考虑两个单独的字段变体 //parent_collection 和 parent_id @AsyaKamsky,是的,我考虑过这个变体,而且这就是它现在的实现方式。但我还需要显示单独的照片列表。而且我敢肯定,在显示事件时,对照片集合的一个额外查询比在显示照片时对事件的多个查询要好。 【参考方案1】:

首先,检查哪个字段的命中数。 其次,创建一个具有最大命中字段的复合索引。 第三,创建一个具有最小命中字段的复合索引。

注意: 如果一次命中大量字段,则使用复合索引。 其他情况创建单一索引。

【讨论】:

以上是关于MongoDB 一个复合索引与多个单字段索引的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB索引问题

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

MongoDB - 唯一索引与复合索引

大数据查询mongodb、聚合、单索引或复合索引

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

SQL Server的复合索引学习转载