假设我在数据库中有 100 万个条目,数据库中有 10 个字段/(“列”)。在我看来,我搜索的列越多,查询速度就越快 - 例如:
db.items.find( {
$and: [
{ field1: x },
{ field2: y },
{ field3: z}
]
} )
快于:
db.items.find( {
$and: [
{ field1: x },
{ field2: y }
]
} )
虽然我很想说“太棒了,这对我来说完全有意义”——但事实并非如此。我只知道它发生在我的特殊情况下,想知道这是否真的总是如此。如果是这样,理想情况下,我想知道为什么。
此外,在创建多字段索引时,以任何顺序排列它们是否有帮助。例如,假设我添加了一个 compound index :
db.collection.ensureIndex( { field1: 1, field2: 1, field3: 1 } )
这些有什么顺序吗?如果是,顺序重要吗?假设 90% 的项目将匹配字段 1 条件,但 1% 的项目将匹配字段 3 条件。订购它们会有什么不同吗?
最佳答案
这可能只是限制性更强的查询返回更少文档的情况,因为 90% 的项目将匹配字段 1 条件,而只有 1% 的项目将匹配字段 3 条件。检查什么explain对这两个查询都说。
Mongo 有很好的profiler .试试看。使用不同的索引和不同的查询。当然不在生产数据库上。
索引中字段的顺序很重要。如果你有一个索引 { field1: 1, field2: 1, field3: 1 }
和查询 db.items.find( { field2: x, field3: y })
,根本不会使用索引,
对于查询 db.items.find( { field1: x, field3: y })
它只能部分用于 field1
。
另一方面,查询条件的顺序并不重要:
db.items.find( { field1: x, field2: y })
和
一样好
db.items.find( { field2: y, field1: x })
并且在这两种情况下都将使用索引。
在选择索引策略时,您应该同时检查数据和典型查询。可能是这样,index intersection对你来说效果更好,而不是单一的复合索引,你可以使用像 { field1: 1}
, { field2: 1}
, 这样的简单索引来获得更好的总体性能{ field3: 1}
,而不是针对不同类型查询的多个复合索引。
检查索引大小到 fit it in memory 也很重要.无论如何,在大多数情况下。
关于mongodb - Mongo 查询 - 约束数量与速度(和索引!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35371551/