玩
之后db.largecollection.find({$或:[{identifierX:“sha1_hash123”},{identifierY:“md5_hash456”},{identifierZ:“another_hash789”}]})
我检查了mongodb自动编写的索引。除了标识符x / y / z的“single”ensureIndex之外,现在还有一个identifierX_1_identifierY_1_identifierZ_1并且性能下降: - (
您是否有想法或提示如何向mongodb解释使用单个标识符的索引更快,因为我没有$和$或查询?
THX
答案 0 :(得分:3)
MongoDB不会自己创建索引。这是应用程序,用户或框架所做的事情。对于您的查询,MongoDB只能使用identifierX,identifierY或identifierZ的索引。但是,如果您没有这样的索引,那么当然不会使用任何索引。 identifierX_1_identifierY_1_identifierZ_1
索引不能用于此查询。
在这种情况下,您可能需要为所有这些标识符创建一个索引:
db.ensureIndex( { 'identifierX' : 1 } );
db.ensureIndex( { 'identifierY' : 1 } );
db.ensureIndex( { 'identifierZ' : 1 } );
MongoDB一次只能使用一个索引,它会尝试选择“最佳”索引。尝试使用explain
查看正在挑选的索引:
db.largecollection.find( { $or : [
{ identifierX : "sha1_hash123" },
{ identifierY : "md5_hash456" },
{ identifierZ : "another_hash789" }
] } ).explain();
这应该会给你一些关于使用哪个索引的想法。
$or
有一个例外,其中MongoDB可以为每个部分使用不同的索引并为您提供重复数据删除。它位于docs。它(当然)仍然不会使用复合索引,你需要我在上面写的索引。