3

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

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

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

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

4

1 回答 1

3

如果复合索引更大,那么单个字段是否会更好地将所有值的串联散列添加到所有对象,将单个索引添加到散列字段并通过该索引进行搜索(尽管听起来不像好的做法)?

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

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

顺便说一句,MongoDB 对此有内置支持。如果地址是嵌入的,则在整个子文档上使用散列索引将完成您需要的操作:

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"  } } );
于 2015-03-12T11:13:53.167 回答