如何提高 mongoDb 查询性能?
How to improve mongoDb query performance?
我有一个名为 Codes
的集合。 Schema
是这样定义的:
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')
选项的查询 returns:
{
"executionSuccess" : true,
"nReturned" : 6,
"executionTimeMillis" : 0,
"totalKeysExamined" : 10,
"totalDocsExamined" : 10,
}
这似乎不对,因为检查的文档数量大于返回的文档数量。
索引本身是正确的。
必须是CodesSchema.index
,不是Code.index
。
确保调用 Code.syncIndexes
更新索引 dbside。
"explain" 部分 - 你应该检查 winningPlan
。
如果查询没有使用索引,它应该是这样的
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
使用索引时,它会变为
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
我有一个名为 Codes
的集合。 Schema
是这样定义的:
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')
选项的查询 returns:
{
"executionSuccess" : true,
"nReturned" : 6,
"executionTimeMillis" : 0,
"totalKeysExamined" : 10,
"totalDocsExamined" : 10,
}
这似乎不对,因为检查的文档数量大于返回的文档数量。
索引本身是正确的。
必须是CodesSchema.index
,不是Code.index
。
确保调用 Code.syncIndexes
更新索引 dbside。
"explain" 部分 - 你应该检查 winningPlan
。
如果查询没有使用索引,它应该是这样的
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
使用索引时,它会变为
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {