Volver a MongoDB Intermedio

Optimización de Rendimiento en MongoDB

Consultas Lentas y Profiling

// Habilitar profiling (consultas > 100ms) db.setProfilingLevel(1, { slowms: 100 }) db.system.profile.find().sort({ ts: -1 }).limit(10) // Ver operaciones en curso db.currentOp({ secs_running: { $gt: 5 } }) // Cancelar operación lenta db.killOp(<opId>)

explain() en Detalle

const plan = db.pedidos.find({ clienteId: "u123", estado: "activo" }).explain("allPlansExecution") // Campos clave: // plan.queryPlanner.winningPlan.stage → IXSCAN (bien) vs COLLSCAN (mal) // plan.executionStats.totalDocsExamined → debe ≈ nReturned // plan.executionStats.executionTimeMillis → objetivo < 10ms en OLTP

Memoria y Conjunto de Trabajo

// Estado del servidor — uso de memoria db.serverStatus().mem // { // resident: 512, // MB en RAM // virtual: 2048 // MB virtual // } // Caché de WiredTiger db.serverStatus().wiredTiger.cache

Pool de Conexiones

const mongoose = require("mongoose"); mongoose.connect(uri, { maxPoolSize: 20, minPoolSize: 5, socketTimeoutMS: 30000, serverSelectionTimeoutMS: 5000, heartbeatFrequencyMS: 10000 })

Consejos para el Pipeline de Agregación

// 1. $match PRIMERO para reducir docs con índice // 2. $project para eliminar campos innecesarios // 3. $limit antes de $lookup cuando sea posible // 4. allowDiskUse para agregaciones grandes db.pedidos.aggregate([...pipeline], { allowDiskUse: true }) // 5. Evitar $where y $function (JS no optimizable) // 6. Usar $expr para comparar campos con soporte de índice db.pedidos.find({ $expr: { $gt: ["$total", "$montoMinimo"] } })

Diseño de Esquema para Rendimiento

// Anti-patrón: array sin límite actualizado constantemente // Solución: patrón bucket o colección separada // Anti-patrón: contadores con lectura-modificación-escritura // Solución: $inc atómico await contadores.updateOne( { _id: "visitas_pagina" }, { $inc: { valor: 1 } }, { upsert: true } ) // Anti-patrón: colección polimórfica sin índice discriminador // Solución: agregar campo tipo e indexarlo db.activos.createIndex({ tipo: 1 })

Monitoreo con mongostat / mongotop

# mongostat — métricas en vivo del servidor mongostat --host localhost:27017 --username admin --password ... # mongotop — tiempo de lectura/escritura por colección mongotop --host localhost:27017 # Métricas relevantes: # insert/query/update/delete por segundo # faults: page faults → conjunto de trabajo > RAM # locked%: alto → contención de escrituras