mongodb中的复合索引或单个索引

时间:2013-10-03 22:11:35

标签: mongodb

我得到了一个这样的查询,有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”}

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

1 个答案:

答案 0 :(得分:3)

正如muratgu已经指出的那样,推理绩效的最好方法是停止推理并开始测量。

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

您可能需要考虑一个复合索引{"ws.wz.eId", "ws.ce1.id"},因为它可以用于90%的情况,而对于百分之十的情况,相当于只有一个索引{ {1}}。

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

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