MongoDB复合索引与单个FIeld索引的空间消耗方面

时间:2015-03-12 10:11:10

标签: performance mongodb indexing memory-consumption compound-index

根据this帖子,复合索引的维度更大(我找不到很多关于文档的信息,所以如果你能指出我那里我会很感激)。

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

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

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

1 个答案:

答案 0 :(得分:3)

  

如果复合索引较大,则单个字段最好不要将所有值的串联散列添加到所有对象,将单个索引添加到散列字段并按其搜索(尽管它听起来不是一个好习惯吗?

这些完成了不同的事情。复合索引具有顺序,该顺序具有效果。例如,索引{ 'country' : 1, 'city' : 1, 'postcode' : 1 }将允许搜索特定国家/地区的特定城市中的所有地址。哈希不能这样做 - 哈希支持完全匹配。

我根本不知道这是多么糟糕的做法,它只是一个非常狭窄的用例。请记住,除了拼写,额外的空格等方面的每一个细微差别都会产生不同的哈希值,并且您甚至无法回答简单的问题,例如"我们存储了多少个国家/地区的地址?&#34 ;。但如果你不需要,为什么不呢?

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

  

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

e.g:

> 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"  } } );