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