【问题标题】:MongoDB one compound index vs multiple single field indexesMongoDB 一个复合索引与多个单字段索引
【发布时间】: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,是的,我考虑过这个变体,而且这就是它现在的实现方式。但我还需要显示单独的照片列表。而且我敢肯定,在显示事件时,对照片集合的一个额外查询比在显示照片时对事件的多个查询要好。

标签: mongodb indexing


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2016-10-19
    • 2018-06-02
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多