From 91e7229b234985fd648b5199c3564c2a67325894 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 28 Dec 2024 09:34:27 -0800 Subject: [PATCH 1/4] Add indices to Check model --- Server/db/models/Check.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Server/db/models/Check.js b/Server/db/models/Check.js index ad50c208a..1946f2c59 100644 --- a/Server/db/models/Check.js +++ b/Server/db/models/Check.js @@ -67,5 +67,8 @@ const BaseCheckSchema = mongoose.Schema({ */ const CheckSchema = mongoose.Schema({ ...BaseCheckSchema.obj }, { timestamps: true }); CheckSchema.index({ createdAt: 1 }); +CheckSchema.index({ monitorId: 1, createdAt: 1 }); +CheckSchema.index({ monitorId: 1, createdAt: -1 }); + export default mongoose.model("Check", CheckSchema); export { BaseCheckSchema }; From ce3e7cf38474dd08fce2a4c0356ad27acf2a419b Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 28 Dec 2024 09:35:00 -0800 Subject: [PATCH 2/4] Add indices to HardwareCheck model --- Server/db/models/HardwareCheck.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Server/db/models/HardwareCheck.js b/Server/db/models/HardwareCheck.js index ba6fbdf2d..76b9dfc2e 100644 --- a/Server/db/models/HardwareCheck.js +++ b/Server/db/models/HardwareCheck.js @@ -64,5 +64,7 @@ const HardwareCheckSchema = mongoose.Schema( ); HardwareCheckSchema.index({ createdAt: 1 }); +HardwareCheckSchema.index({ monitorId: 1, createdAt: 1 }); +HardwareCheckSchema.index({ monitorId: 1, createdAt: -1 }); export default mongoose.model("HardwareCheck", HardwareCheckSchema); From bdf23a45b7beb8523a5e560425e3267aaaa1cef5 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 28 Dec 2024 09:35:34 -0800 Subject: [PATCH 3/4] Sync indices on startup --- Server/db/mongo/MongoDB.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Server/db/mongo/MongoDB.js b/Server/db/mongo/MongoDB.js index 882c862e0..12b32c5db 100644 --- a/Server/db/mongo/MongoDB.js +++ b/Server/db/mongo/MongoDB.js @@ -91,6 +91,13 @@ class MongoDB { appSettings = new AppSettings({}); await appSettings.save(); } + // Sync indexes + const models = mongoose.modelNames(); + for (const modelName of models) { + const model = mongoose.model(modelName); + await model.syncIndexes(); + } + logger.info({ message: "Connected to MongoDB" }); } catch (error) { logger.error({ From 0b5594f9c95590fbbe4dbd3185c69216a009a8e9 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Sat, 28 Dec 2024 09:37:00 -0800 Subject: [PATCH 4/4] force index usage for getMonitorStatsById --- Server/db/mongo/modules/monitorModule.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Server/db/mongo/modules/monitorModule.js b/Server/db/mongo/modules/monitorModule.js index fa72aad21..2c471a80f 100644 --- a/Server/db/mongo/modules/monitorModule.js +++ b/Server/db/mongo/modules/monitorModule.js @@ -223,15 +223,22 @@ const getDateRange = (dateRange) => { * @returns {Promise} All checks and date-ranged checks */ const getMonitorChecks = async (monitorId, model, dateRange, sortOrder) => { + const indexSpec = { + monitorId: 1, + createdAt: sortOrder, // This will be 1 or -1 + }; + const [checksAll, checksForDateRange] = await Promise.all([ - model.find({ monitorId }).sort({ createdAt: sortOrder }), + model.find({ monitorId }).sort({ createdAt: sortOrder }).hint(indexSpec).lean(), model .find({ monitorId, createdAt: { $gte: dateRange.start, $lte: dateRange.end }, }) - .sort({ createdAt: sortOrder }), + .hint(indexSpec) + .lean(), ]); + return { checksAll, checksForDateRange }; };