2

我有一个这样的查询,它在 90% 的时间里被调用:

db.xyz.find({“ws.wz.eId”:665,“ws.ce1.id”:665)

另一个像这样的被调用的次数为 10%:

db.xyz.find({“ws.wz.eId”:111,“ws.ce2.id”:111)

您可以看到两个查询中两个集合的 id 相同。现在我想知道是否应该只为“ws.wz.eId”创建一个索引,或者是否应该创建两个复合索引:一个用于 {"ws.wz.eId", "ws.ce.id"}另一个是 {"ws.wz.eId", "ws.ce2.id"}

在我看来,单一索引是最好的选择;但是我可能错了;所以我想知道创建复合索引或任何其他类型是否有价值。

4

1 回答 1

3

正如muratgu 已经指出的那样,对性能进行推理的最佳方法是停止推理并开始测量。

然而,由于测量可能非常棘手,这里有一些理论:

您可能需要考虑一个复合索引{"ws.wz.eId", "ws.ce1.id"},因为它可用于 90% 的情况,对于 10% 的情况,相当于仅在ws.wz.eId.

当你这样做时,第一个查询可以通过索引匹配,第二个查询必须首先找到所有匹配的候选者ws.wz.eId(快速,存在索引),然后扫描并匹配所有候选者以过滤掉那些不匹配的文档' t 符合ws.ce2.id标准。这是否昂贵取决于ws.wz.eId必须扫描的相同文档的数量,因此这在很大程度上取决于您的数据。

一个重要的因素是密钥的选择性。例如,如果有一百万个文档具有相同的内容ws.wz.eId,而其中只有一个具有ws.ce2.id您要查找的内容,则您可能需要索引,或者想要反转查询。

于 2013-10-04T18:45:25.683 回答