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

Posted

技术标签:

【中文标题】MongoDB 复合索引与单字段索引在空间消耗方面的对比【英文标题】:MongoDB compound indexes vs Single FIeld Indexes in terms of space consumption 【发布时间】:2015-05-14 10:32:17 【问题描述】:

根据this,复合后索引的维度更大(我在文档上找不到太多信息,所以如果您能指出我将不胜感激)。

假设我必须通过一系列地址来搜索整个地址(我们可以假设我将始终在集合和查询中拥有所有可用的字段),例如


  name: String,
  street: String,
  postcode: String,
  City: String,
  Country: String

我的问题是:复合索引会有多大? 如果复合索引更大,那么单个字段是否会更好地将所有值的串联哈希添加到所有对象,向哈希字段添加单个索引并按其搜索(尽管听起来不像好的做法)?

【问题讨论】:

【参考方案1】:

如果复合索引更大,那么单个字段是否会更好,将所有值的串联哈希添加到所有对象,向哈希字段添加单个索引并按其搜索(尽管它没有听起来不错)?

它们完成不同的事情。复合索引具有顺序并且该顺序具有效果。例如,索引 'country' : 1, 'city' : 1, 'postcode' : 1 将允许搜索特定国家的特定城市中的所有地址。哈希不能做到这一点 - 哈希支持完全匹配。

我根本不认为这是一种不好的做法,这只是一个非常狭窄的用例。请记住,拼写、额外空格等的每一个细微差别都会导致不同的哈希值,而且您甚至无法回答诸如“我们在 X 国家/地区存储多少地址?”之类的简单问题。但如果你不需要它,为什么不呢?

顺便说一下,MongoDB 已经内置了对此的支持。如果地址是嵌入的,使用hashed index on the entire subdocument 将完成您所需要的:

MongoDB 支持任何单个字段的哈希索引。散列函数折叠嵌入的文档并计算整个值的散列,

例如:

> db.hash.insert( "name": "john", "address" :  "city" : "Chicago", "state":"IL",
                   "country" : "US"   );
WriteResult( "nInserted" : 1 )
> db.hash.createIndex(  "address" : "hashed"  );
...
>
> This query uses the index and finds the document:
> db.hash.find("address" : "city" : "Chicago", "state": "IL", "country" : "US"   );
>
> // this query wont find the document b/c of missing state, but is still fast (IXSCAN)
> db.hash.find("address" : "city" : "Chicago", "country" : "US"    );

【讨论】:

非常感谢您的回答,非常符合我的需要。我会接受,但我也想看看是否有人就空间消耗问题提供更多信息或参考

以上是关于MongoDB 复合索引与单字段索引在空间消耗方面的对比的主要内容,如果未能解决你的问题,请参考以下文章

具有稀疏复合索引的 MongoDB $near 地理空间查询错误 13311

mongodb3.0的索引管理学习整理

复合索引的顺序在 MongoDB 性能方面有何影响?

MongoDB索引问题

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

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