mongodb - Mongo 查询 - 约束数量与速度(和索引!)

标签 mongodb indices

假设我在数据库中有 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/

相关文章:

mongodb - map 减少与时区

mongodb - 只用 Mongodb 和 Golang 返回查找的文档

performance - 查找矩阵中多个值对的所有索引

python - 优化Python字典/负索引存储

node.js - 无法更新 mongo 文档中的嵌入项目(无方法更新)

javascript - 使用 Mongoose 插入文档时出现问题

node.js - 在 Mongoose 中合并两个文档的数组

matlab - 如何找到向量的下降部分并将其删除?

java - 如何将Bufferedimage转换为索引类型,然后提取argb调色板

r - 如何将用户指定的索引传递到插入符 trainControl 中?