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