- Uso
- Aplicaciones y herramientas con un solo archivo de datos y un solo escritor a la vez
- Ajustamos
journal_mode=WAL- Copias
- Una copia en caliente del archivo, nunca la copia de un archivo en uso
Bases de datos
Donde un sitio es rápido o lento: en su base de datos.
Instalamos, optimizamos, replicamos y respaldamos la base de datos de su aplicación, y demostramos que las copias sirven restaurándolas.
Siete motores, dibujados como un solo esquema
Cada caja es una base de datos que instalamos, optimizamos y respaldamos. Las líneas muestran cómo trabajan juntas en los sistemas que gestionamos: la mayoría de las aplicaciones necesitan dos o tres, no una.
- Uso
- Tiendas, WordPress y la mayoría de las aplicaciones PHP
- Ajustamos
innodb_buffer_pool_size- Copias
- Copias completas más logs binarios, a cualquier momento
- Uso
- Caché, sesiones, colas y contadores
- Ajustamos
maxmemory-policy- Copias
- Instantáneas y un archivo append-only
- Uso
- Contabilidad, ERP, informes y consultas complejas
- Ajustamos
shared_buffers · work_mem- Copias
- Copias base más WAL archivado, a cualquier momento
- Uso
- Los mismos usos que MySQL, y clústeres Galera
- Ajustamos
innodb_buffer_pool_size- Copias
- mariabackup más logs binarios, a cualquier momento
- Uso
- Búsqueda en productos y artículos, filtros, logs
- Ajustamos
JVM heap · shards- Copias
- Instantáneas; el índice puede reconstruirse desde la base de datos principal
- Uso
- Registros cuya forma cambia: eventos, catálogos, contenidos
- Ajustamos
wiredTiger cacheSizeGB- Copias
- Un replica set, con el oplog para un momento concreto
- 1Cuando una aplicación se queda grande para un archivo, pasa a un servidor de base de datos.
- 2MariaDB nació como un fork de MySQL; la mayoría de las aplicaciones pasan de una a otra sin cambios.
- 3Redis se sitúa delante: las respuestas repetidas y las sesiones se quedan en memoria.
- 4La misma caché delante de las aplicaciones PostgreSQL.
- 5El índice de búsqueda se alimenta de la base de datos principal, nunca al revés.
- 6El JSONB de PostgreSQL cubre muchos usos de documentos antes de necesitar MongoDB.
Qué base de datos para cada trabajo
Normalmente decide la aplicación, y la seguimos. Cuando la elección está abierta, así es como elegimos.
| El trabajo | Nuestra primera opción | También sirve | Por qué |
|---|---|---|---|
| Una tienda, un sitio WordPress o una aplicación PHP | MySQL · MariaDB | PostgreSQL | Aquello sobre lo que se construyó y probó la aplicación, con el soporte más amplio. |
| Contabilidad, ERP e informes con muchas uniones | PostgreSQL | MySQL 8 | Transacciones estrictas, funciones de ventana y un planificador hecho para consultas complejas. |
| Caché, sesiones, colas y límites de peticiones | Redis | Memcached | Respuestas desde memoria. Guarde ahí lo que pueda reconstruirse si se pierde. |
| Búsqueda en productos o artículos | OpenSearch · Elasticsearch | MySQL · PostgreSQL full-text | Relevancia, errores de escritura, filtros y facetas que una consulta LIKE no puede dar. Para un catálogo pequeño basta con la búsqueda de texto completo de la propia base de datos. |
| Una app móvil, una herramienta de escritorio o un pequeño servicio interno | SQLite | —Ninguna otra | Sin servidor que mantener: un archivo, respaldado copiándolo de forma segura. |
| Eventos, logs o registros cuya forma cambia | MongoDB | PostgreSQL JSONB | Documentos flexibles; PostgreSQL cuando además necesitan uniones y transacciones. |
| Lecturas que superan a un solo servidor | MySQL · MariaDB · PostgreSQL replicas | —Ninguna otra | Las lecturas se reparten entre réplicas y las escrituras se quedan en un único principal. |
Una consulta lenta, encontrada y corregida
Detrás de la mayoría de las páginas lentas hay una consulta. El registro de consultas lentas la señala, EXPLAIN muestra por qué es lenta y, a menudo, un solo índice es toda la solución.
SELECT id, total, created_at
FROM orders
WHERE customer_id = 4821
ORDER BY created_at DESC
LIMIT 20;
Antes
- type
- ALL
- key
- NULL
- Extra
- Using where; Using filesort
Lee todas las filas de la tabla y luego ordena lo que encontró.
La solución: un índice
ALTER TABLE orders
ADD INDEX idx_customer_created (customer_id, created_at);
Después
- type
- ref
- key
- idx_customer_created
- Extra
- Backward index scan
Lee solo las filas de este cliente, ya ordenadas.
Una copia cuenta cuando se ha restaurado
Una copia nocturna por sí sola pierde el día. Guardando también el registro de cambios, podemos devolver la base de datos al segundo anterior a un error.
00:00
Restaurada hasta aquí14:31:59
Un DELETE sin WHERE14:32:00
- Restaurar la última copia completa
En un servidor aparte, para que la base de datos en producción quede intacta mientras trabajamos.
- Reproducir el registro hasta el momento anterior
Los logs binarios en MySQL y MariaDB, el WAL archivado en PostgreSQL, el oplog en MongoDB.
- Comprobarla y recuperar los datos
O se vuelven a copiar las filas perdidas, o la copia restaurada toma el relevo: usted decide, con la diferencia delante.
La recuperación a un momento concreto depende del motor:
- MySQL · MariaDB · PostgreSQL · MongoDBa cualquier segundo que cubra el registro
- Redishasta la última escritura del archivo append-only
- SQLitehasta la última copia del archivo
- OpenSearch · Elasticsearchhasta la última instantánea, y luego se reconstruye desde el origen
Las pruebas de restauración forman parte del cuidado que acordamos con usted: en un servidor aparte, con un calendario fijo y cada resultado anotado. Una copia que nadie ha restaurado es una esperanza, no una copia.
El resto del trabajo
Lo que necesita una base de datos desde el día en que se instala hasta el día en que se actualiza, y los ajustes que toca cada paso.
-
Instalación y dimensionamiento
La versión que admite su aplicación, desde el repositorio oficial del fabricante. La memoria se reparte entre la base de datos, la aplicación y el sistema antes de ajustar nada más.
innodb_buffer_pool_size · shared_buffers · maxmemory · -Xmx -
Índices y consultas lentas
Se lee el registro de consultas lentas, se explican las peores consultas y se añaden o quitan índices dejando anotado el motivo.
slow_query_log · pg_stat_statements · EXPLAIN ANALYZE -
Replicación
Una segunda copia que sigue a la primera, para repartir las lecturas y tomar el relevo si falla el servidor principal.
GTID · Galera · streaming replication · replica set -
Seguridad
Escucha solo en la red privada, un usuario por aplicación con solo los permisos que necesita y conexiones cifradas siempre que el tráfico salga del servidor.
bind-address · TLS · GRANT · SCRAM · ACL -
Supervisión
Conexiones, retraso de replicación, espacio en disco y consultas lentas, con una alerta antes de llegar a un límite y no después.
max_connections · Seconds_Behind_Source · pg_stat_replication -
Actualizaciones
Ensayadas primero en una copia, las réplicas antes que el principal y el camino de vuelta escrito antes de empezar.
pg_upgrade · mariadb-upgrade · rolling restart

Cuéntenos qué hace su base de datos
Qué motor, qué tamaño, dónde se ejecuta y qué le preocupa. Primero lo revisamos y después presupuestamos la puesta en marcha o el cuidado tras una conversación.