Node.js 如何提高mongoDb查询性能?
我有一个名为Codes的集合。这就是架构的定义方式:Node.js 如何提高mongoDb查询性能?,node.js,mongodb,mongoose,mongodb-query,database-performance,Node.js,Mongodb,Mongoose,Mongodb Query,Database Performance,我有一个名为Codes的集合。这就是架构的定义方式: import mongoose from 'mongoose' import autoIncrement from 'mongoose-auto-increment'; const Schema = mongoose.Schema; const CodesSchema = mongoose.Schema( { configId: { type: Number }, campaignId: { type: Number }
import mongoose from 'mongoose'
import autoIncrement from 'mongoose-auto-increment';
const Schema = mongoose.Schema;
const CodesSchema = mongoose.Schema(
{
configId: { type: Number },
campaignId: { type: Number },
permissions: {
all: { type: Boolean, default: false },
users: { type: [Number], default: [] }
}
)
autoIncrement.initialize(mongoose.connection);
CodesSchema.plugin(autoIncrement.plugin, { model: 'Codes', field: 'campaignId' });
export default mongoose.model('Codes', CodesSchema)
有一个查询如下所示:
const query = {
$and:[
{$or: [
{'permissions.all': true},
{'permissions.users': 12}
]},
{configId: 3}
]
};
Codes.find(query, (err, res) => {
// do something with the result
})
这很好,但是如果数据库中有大量的文档,那么这个查询会非常慢
我可以做些什么来提高这个特定查询的性能吗?我认为createIndex会有所帮助,但我不确定是否可以应用,因为有$and和$or条件
更新
我以这种方式添加了索引:
CodesSchema.index({configId: 1, 'permissions.all': 1, 'permissions.users': 1});
但是使用.explain'executionStats'选项运行查询会返回:
{
"executionSuccess" : true,
"nReturned" : 6,
"executionTimeMillis" : 0,
"totalKeysExamined" : 10,
"totalDocsExamined" : 10,
}
这似乎不正确,因为检查的文档数大于返回的文档数。索引本身是正确的 它必须是codeschema.index,而不是Code.index 确保调用以更新索引dbside 解释部分-您应该检查winningPlan 如果查询没有使用索引,则应该是
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
使用索引时,它将更改为
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
它可以。试着用indexFilterSet检查索引使用情况,我应该寻找什么?如果是,则设置为false。否,您应该查找。我猜。您正在使用mongoose,是吗?是的,我正在使用mongoose如果我将index:true设置为configId字段,那么这应该足以提高该查询的性能?检查winningPlan显示所有索引都已使用。我试图一个接一个地创建索引,而不是像所提供的示例中那样使用多个索引,评估文档的总数减少了近50%,但rejectedPlans返回1个对象。。。这是错的吗?基本上,我是在问当有被拒绝的计划时是否有问题请阅读文档并理解简单索引、复合索引和覆盖查询之间的区别。RejectedPlans是可能查询的列表。规划者试着让所有人都选一个性能最好的。如果有多种方法来完成查询,您将始终拥有它们。要提供附加信息,请注意索引大小和此索引的写入性能:由于您的permissions.users字段是一个数组,将为数组的每个元素创建一个索引项,因此在插入数据时,索引将快速增长。此外,当索引排序时,在此数组中添加/删除数据将导致索引部分重写。选择索引字段时请记住这一点。