【问题标题】:Mongo indexes in detailMongo索引详细
【发布时间】:2012-08-20 08:34:39
【问题描述】:

我有如下所示的 mongo db 集合

collection {
   X: 1,
   Y: 2,
   Z: 3,
   T_update: 123,
   T_publish: 243,
   T_insert: 342
}

我必须创建一个像

这样的索引
{X: 1, Y: 1, Z: 1, T_update: 1}
{X: 1, Y: 1, Z: 1, T_publish: 1}
{X: 1, Y: 1, Z: 1, T_insert: 1}

但我看到的是值 X: 1, Y:1, Z:1 会导致冗余,并且我打算用于排序的唯一时间参数正在改变。有没有更好的方法来创建上述索引,这样我就不用创建三个单独的索引了。

还说我是否有类似的索引

{X: 1, Y: 1, Z: 1, T_update: 1}

我希望 Mongo 返回结果,使得 x = 5,y = 任何值,Z = 4,sort = T_update 上面的索引会有用还是我应该创建一个索引,例如

{X:1, Z:1, T_update: 1},

我希望我能避免它。

【问题讨论】:

  • 回答你问题的最后一部分(其余部分由亚当回答);不,它不会将 X、Y、Z、T_update 索引用于 X、Z、T_update 查询。它总是从左到右,因此如果您想省略索引字段,这些字段必须位于复合索引的最右侧。请注意,如果您对排序字段进行排序,也可能成为该问题的一部分。

标签: mongodb mongodb-indexes


【解决方案1】:

这里的答案将取决于您要索引的字段的选择性 - 如果您将用于过滤 X、Y 或 Z 的标准不是很有选择性,那么它们基本上可以被忽略(或移至复合键的右边)。

假设您正在使用 Y 不等于 1 之类的过滤器,其中 1 是一个稀有值。由于您将遍历几乎整个索引以返回大部分值并扫描数据,因此在 Y 上建立索引将比首先为排序建立索引的好处少。鉴于这种情况,如果在 T_Update 上进行排序,那么拥有如下索引可能会有所帮助:{T_update: 1, Y : 1}

最后,就最有效的索引方式而言,这里有很多排列。为您的数据集找出最佳索引的真正方法是使用 explain()hint() 根据您的特定查询模式和数据集测试各种索引。

【讨论】:

  • 同意,选择性是关键。避免将低基数字段添加到复合索引,除非它们非常有选择性,并且总是尽可能地对复合索引字段排序。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多