Rendimiento de bases de datos

Técnicas probadas para que tu base de datos no sea el cuello de botella de tu aplicación

10 min

La base de datos es el componente más crítico y potencialmente el mayor cuello de botella de cualquier aplicación web. Una query mal optimizada puede bloquear toda la aplicación bajo carga; un índice faltante puede multiplicar por 100 el tiempo de respuesta de un endpoint. El rendimiento de la base de datos impacta directamente en la experiencia de usuario y la escalabilidad del sistema.

Esta guía cubre las técnicas fundamentales de optimización de bases de datos: indexación efectiva, optimización de queries, estrategias de caché, connection pooling, monitorización y opciones de escalado. Conceptos aplicables tanto a bases de datos relacionales (PostgreSQL, MySQL) como NoSQL (MongoDB, Redis).

Indexación: el mayor impacto con menor esfuerzo

Los índices son la herramienta más poderosa para mejorar el rendimiento de consultas. Sin un índice adecuado, la base de datos realiza un full table scan (recorre todas las filas) para cada consulta. Con el índice correcto, la misma consulta puede resolverse en microsegundos.

  • Crea índices en columnas usadas en WHERE, JOIN, ORDER BY y GROUP BY
  • Usa índices compuestos cuando tus queries filtran por múltiples columnas simultáneamente
  • Evita sobre-indexar: cada índice consume espacio y ralentiza las escrituras (INSERT/UPDATE/DELETE)
  • Usa EXPLAIN/EXPLAIN ANALYZE para verificar que tus queries usan los índices esperados
  • Índices parciales (PostgreSQL): indexa solo un subconjunto de filas para ahorrar espacio y mejorar rendimiento

Optimización de queries

Un query mal escrito puede ser eficiente con 1.000 registros pero catastrófico con 1 millón. La optimización de queries es un proceso continuo que requiere entender los planes de ejecución y los patrones de acceso a datos de tu aplicación.

  • Evita SELECT *: selecciona solo las columnas que necesitas para reducir I/O
  • Usa paginación con cursores en lugar de OFFSET para datasets grandes: OFFSET recalcula todo desde el inicio
  • Sustituye subqueries correlacionadas por JOINs cuando sea posible: el optimizador de consultas trabaja mejor con JOINs
  • Identifica N+1 queries: un problema clásico en ORMs donde se ejecuta una query por cada registro de la relación
  • Usa batch operations (INSERT INTO ... VALUES múltiples, bulk updates) en lugar de operaciones fila a fila

Estrategias de caché para bases de datos

La caché reduce la carga en la base de datos almacenando resultados de consultas frecuentes en memoria. Redis y Memcached son las opciones más populares como capa de caché entre la aplicación y la base de datos.

Implementa caché para datos que se leen mucho más de lo que se escriben: catálogos de productos, configuraciones, listas de categorías. Usa invalidación por TTL (Time To Live) para datos que cambian periódicamente y write-through o write-behind para datos que cambian en tiempo real.

  • Cache-aside (lazy loading): la aplicación consulta la caché primero; si no está, consulta la DB y la almacena
  • Write-through: cada escritura en DB actualiza la caché simultáneamente. Consistencia garantizada.
  • Write-behind: las escrituras van a caché primero y se sincronizan a DB asincrónicamente. Mejor rendimiento, riesgo de pérdida.
  • Query caching nativo: MySQL Query Cache (deprecado en 8.0), PostgreSQL con pg_stat_statements para identificar queries lentas.

Connection pooling

Cada conexión a la base de datos consume recursos del servidor: memoria, file descriptors y CPU para el proceso de backend. Sin connection pooling, una aplicación web puede agotar las conexiones disponibles bajo carga media, provocando errores que parecen caídas de base de datos.

PgBouncer es el pooler más utilizado para PostgreSQL: gestiona un pool de conexiones que se reutilizan entre peticiones de la aplicación. Para MySQL, ProxySQL ofrece funcionalidad similar. En aplicaciones Node.js, librerías como pg-pool o mysql2 incluyen pooling integrado.

  • Dimensiona el pool según la fórmula: conexiones = (cores * 2) + discos efectivos
  • Configura timeouts de conexión idle para liberar recursos
  • Monitoriza el uso del pool: si está constantemente al 100%, necesitas escalado
  • Usa connection pooling serverless (Neon, PlanetScale, Supabase) para entornos serverless donde las conexiones son efímeras

Monitorización del rendimiento

No puedes optimizar lo que no mides. La monitorización continua de la base de datos permite identificar queries lentas, patrones de uso problemáticos y cuellos de botella antes de que impacten a los usuarios.

  • pg_stat_statements (PostgreSQL) / Performance Schema (MySQL): identifican queries lentas con estadísticas de ejecución
  • Datadog Database Monitoring: trazas de queries con planes de ejecución, esperas y uso de recursos
  • pganalyze / Percona Monitoring: herramientas especializadas para PostgreSQL y MySQL respectivamente
  • Métricas clave: queries por segundo, latencia p95/p99, conexiones activas, uso de caché de buffer pool, IOPS de disco

Estrategias de escalado

Cuando la optimización de queries y la caché no son suficientes, la base de datos necesita escalar. Existen dos estrategias principales, cada una con sus trade-offs.

  • Escalado vertical: más CPU, RAM y SSD al servidor existente. Simple pero con límite físico. Suficiente para la mayoría de aplicaciones.
  • Read replicas: réplicas de solo lectura que distribuyen las consultas SELECT. Reduce la carga del primario. Soporte nativo en PostgreSQL, MySQL y servicios gestionados.
  • Sharding: dividir los datos horizontalmente en múltiples instancias. Complejidad alta, solo justificado en escala masiva.
  • Bases de datos gestionadas: Amazon RDS, Google Cloud SQL, PlanetScale o Neon gestionan backups, replicas y escalado automáticamente.

Puntos clave

  • Los índices son la optimización con mayor impacto: usa EXPLAIN para verificar su uso
  • Identifica y elimina N+1 queries, especialmente si usas un ORM
  • Redis como caché reduce drásticamente la carga de consultas repetitivas
  • Connection pooling es imprescindible en producción para evitar agotamiento de conexiones
  • Monitoriza queries lentas continuamente: pg_stat_statements y herramientas APM son tus aliados

¿Tu base de datos es un cuello de botella?

Analizamos el rendimiento de tu base de datos, optimizamos queries e índices y diseñamos una arquitectura que escale con tu negocio.