Communitygithub.com

mysql-patterns

Patrones de esquema, consultas, índices, transacciones, replicación y pools de conexiones para MySQL y MariaDB en backends de producción.

¿Qué es mysql-patterns?

Esta habilidad proporciona una guía completa y práctica para trabajar con bases de datos MySQL y MariaDB en entornos de producción. Cubre desde el diseño de esquemas y la creación de índices hasta la optimización de consultas lentas, la gestión de transacciones y la configuración de pools de conexiones. Es especialmente útil para desarrolladores que necesitan implementar patrones como paginación por keyset, upserts (inserciones con actualización condicional), búsqueda de texto completo, columnas JSON y colas de trabajo. La habilidad incluye ejemplos de código SQL y de código (Python con SQLAlchemy, Node.js con mysql2) listos para usar, y explica las diferencias de sintaxis entre MySQL y MariaDB para evitar errores. También aborda temas críticos como la replicación con posible retraso de las réplicas de solo lectura, la seguridad (usuarios con mínimos privilegios, SSL) y la configuración del servidor. Además, describe una serie de antipatrones comunes y sus mejores alternativas, y especifica qué debe incluir una revisión basada en esta habilidad: suposiciones de motor/versión, problemas de mayor riesgo, cambios exactos de SQL o código, un plan de validación y las diferencias de sintaxis relevantes.

Compatible con~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/mysql-patterns

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Patrones MySQL

Usa esta habilidad cuando trabajes en diseño de esquemas MySQL o MariaDB, migraciones, investigación de consultas lentas, transacciones tipo cola, pools de conexiones o configuración de bases de datos de producción. Prefiere verificaciones exactas de versión antes de aplicar un patrón específico de una característica porque MySQL y MariaDB han divergido en varios detalles SQL.

Activación

  • Diseñar tablas, índices y restricciones en MySQL o MariaDB
  • Revisar migraciones antes de que se ejecuten en tablas grandes de producción
  • Depurar consultas lentas, esperas de bloqueos, interbloqueos o agotamiento de conexiones
  • Agregar paginación por keyset, upserts, búsqueda de texto completo, columnas JSON o colas
  • Configurar pools de conexiones de aplicaciones, réplicas de solo lectura, TLS o registros de consultas lentas

Verificación de Versión

Comienza identificando el motor y la versión:

SELECT VERSION();
SHOW VARIABLES LIKE 'version_comment';

Mantén las guías de MySQL y MariaDB separadas cuando la sintaxis difiera:

  • Los documentos de MySQL usan alias de fila como reemplazo de VALUES(col) en ON DUPLICATE KEY UPDATE; VALUES(col) está obsoleto allí.
  • Los documentos de MariaDB usan VALUES(col) como la forma compatible de referenciar valores insertados en ON DUPLICATE KEY UPDATE; úsalo para compatibilidad entre motores.
  • SKIP LOCKED es apropiado solo para trabajo tipo cola. Omite filas bloqueadas y puede devolver una vista inconsistente, así que no lo uses para contabilidad general o lecturas sensibles a la integridad.

Valores Predeterminados de Esquema

CREATE TABLE pedidos (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    cuenta_id BIGINT UNSIGNED NOT NULL,
    estado VARCHAR(32) NOT NULL,
    total DECIMAL(15, 2) NOT NULL,
    creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    actualizado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    eliminado_en DATETIME NULL,
    PRIMARY KEY (id),
    KEY idx_pedidos_cuenta_estado_creado (cuenta_id, estado, creado_en),
    KEY idx_pedidos_activos (cuenta_id, eliminado_en)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Elecciones predeterminadas:

Caso de UsoPreferirEvitar
Claves primarias sustitutasBIGINT UNSIGNED AUTO_INCREMENTINT para tablas que pueden crecer más allá de 2B filas
Claves de búsqueda UUIDBINARY(16) con ayudantes de conversiónVARCHAR(36) claves primarias en tablas calientes
Dinero y cantidades exactasDECIMAL(p, s)FLOAT o DOUBLE
Texto orientado al usuarioTablas e índices utf8mb4Valores predeterminados MySQL utf8 / utf8mb3
Marcas de tiempo de aplicaciónDATETIME con UTC gestionado por la aplicaciónAsumir que DATETIME almacena metadatos de zona horaria
Eliminaciones suaveseliminado_en DATETIME NULL más índices con ámbitoFiltrar filas eliminadas suavemente sin un índice
Valores de estado extensiblesTabla de búsqueda o VARCHAR restringidoENUM cuando los valores cambian a menudo

Indexación

El orden de los índices compuestos generalmente sigue primero los predicados de igualdad, luego las columnas de rango u ordenación:

CREATE INDEX idx_pedidos_cuenta_estado_creado
    ON pedidos (cuenta_id, estado, creado_en);

SELECT id, total
FROM pedidos
WHERE cuenta_id = ?
  AND estado = 'pendiente'
  AND creado_en >= ?
ORDER BY creado_en DESC
LIMIT 50;

Usa EXPLAIN antes de agregar o cambiar un índice:

EXPLAIN
SELECT id, total
FROM pedidos
WHERE cuenta_id = 123 AND estado = 'pendiente'
ORDER BY creado_en DESC
LIMIT 50;

Señales para investigar:

CampoSeñal de Riesgo
typeALL en una tabla grande
keyNULL cuando existe un predicado selectivo
rowsEstimación de filas muy alta para una ruta interactiva
ExtraUsing temporary, Using filesort o Using where amplio

Evita agregar índices a ciegas. Cada índice aumenta el costo de escritura, el tiempo de migración, el tamaño de la copia de seguridad y la presión sobre el grupo de búferes.

Patrones de Consulta

Upsert

Forma compatible entre motores:

INSERT INTO configuraciones_usuario (usuario_id, clave_configuracion, valor_configuracion)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
    valor_configuracion = VALUES(valor_configuracion),
    actualizado_en = CURRENT_TIMESTAMP;

Forma de alias de fila MySQL:

INSERT INTO configuraciones_usuario (usuario_id, clave_configuracion, valor_configuracion)
VALUES (?, ?, ?) AS new
ON DUPLICATE KEY UPDATE
    valor_configuracion = new.valor_configuracion,
    actualizado_en = CURRENT_TIMESTAMP;

Usa la forma de alias de fila solo después de confirmar que el destino es MySQL. Usa VALUES(col) para MariaDB o flotas mixtas MySQL/MariaDB.

Paginación por Keyset

SELECT id, nombre, creado_en
FROM productos
WHERE (creado_en, id) < (?, ?)
ORDER BY creado_en DESC, id DESC
LIMIT 50;

Respáldalo con un índice que coincida con el cursor:

CREATE INDEX idx_productos_creado_id ON productos (creado_en, id);

No uses paginación profunda con OFFSET en tablas grandes; obliga al servidor a escanear y descartar filas antes de devolver la página.

Campos JSON

Usa columnas JSON para datos de extensión, no para campos que necesiten filtrado relacional intenso o restricciones.

CREATE TABLE eventos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    payload JSON NOT NULL,
    tipo_evento VARCHAR(64)
        GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(payload, '$.type'))) STORED,
    KEY idx_eventos_tipo (tipo_evento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Para rutas JSON consultadas con frecuencia, expón una columna generada e indexa esa columna. Mantén las claves foráneas, la propiedad, la tenencia y los campos de ciclo de vida como relacionales.

Búsqueda de Texto Completo

ALTER TABLE articulos ADD FULLTEXT KEY ft_articulos_titulo_cuerpo (titulo, cuerpo);

SELECT id, titulo, MATCH(titulo, cuerpo) AGAINST (? IN NATURAL LANGUAGE MODE) AS puntuacion
FROM articulos
WHERE MATCH(titulo, cuerpo) AGAINST (? IN NATURAL LANGUAGE MODE)
ORDER BY puntuacion DESC
LIMIT 20;

Usa búsqueda externa cuando necesites tolerancia a errores tipográficos, clasificación compleja, facetas entre tablas o análisis específico de idioma más allá del comportamiento integrado de texto completo.

Transacciones

Mantén las transacciones cortas y bloquea las filas en un orden consistente:

START TRANSACTION;

SELECT id, saldo
FROM cuentas
WHERE id IN (?, ?)
ORDER BY id
FOR UPDATE;

UPDATE cuentas SET saldo = saldo - ? WHERE id = ?;
UPDATE cuentas SET saldo = saldo + ? WHERE id = ?;

COMMIT;

Lista de verificación de interbloqueo y espera de bloqueo:

  • Bloquea filas en un orden determinista en todas las rutas de código.
  • Realiza llamadas API externas antes de abrir la transacción, no dentro de ella.
  • Agrega índices para predicados usados en UPDATE, DELETE y lecturas con bloqueo.
  • En caso de interbloqueo, retrocede y reintenta toda la transacción con un presupuesto de reintento limitado.
  • Captura SHOW ENGINE INNODB STATUS\G poco después de un interbloqueo; se sobrescribe por eventos posteriores.

Reclamación de trabajador tipo cola:

START TRANSACTION;

SELECT id
FROM trabajos
WHERE estado = 'pendiente'
ORDER BY creado_en
LIMIT 1
FOR UPDATE SKIP LOCKED;

UPDATE trabajos
SET estado = 'procesando', iniciado_en = CURRENT_TIMESTAMP
WHERE id = ?;

COMMIT;

Usa SKIP LOCKED solo para cargas de trabajo tipo cola donde sea aceptable omitir una fila bloqueada. No es un reemplazo para la consistencia transaccional normal.

Pools de Conexiones

Ejemplo con SQLAlchemy:

from sqlalchemy import create_engine

engine = create_engine(
    "mysql+mysqlconnector://app:[email protected]/app",
    pool_size=10,
    max_overflow=5,
    pool_timeout=30,
    pool_recycle=240,
    pool_pre_ping=True,
    connect_args={"connect_timeout": 5},
)

Ejemplo con Node.js mysql2:

import mysql from 'mysql2/promise';

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
  enableKeepAlive: true,
  keepAliveInitialDelay: 30000,
});

const [rows] = await pool.execute(
  'SELECT id, total FROM pedidos WHERE cuenta_id = ? LIMIT 50',
  [accountId],
);

Mantén el reciclaje del pool de la aplicación por debajo del wait_timeout del servidor. Si el servidor usa wait_timeout = 300, un pool_recycle de alrededor de 240 segundos es coherente; pool_pre_ping aún ayuda a recuperarse de eventos de red y conmutación por error.

Diagnóstico

Comandos de primera pasada útiles:

SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G;
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

Habilita el registro de consultas lentas en un entorno controlado:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';

Usa EXPLAIN ANALYZE solo cuando sea seguro ejecutar la consulta. Ejecuta la sentencia y puede ser costoso en datos de tamaño de producción.

Replicación

Las réplicas de solo lectura pueden retrasarse. No enrutes rutas de lectura-después-de-escritura, flujos de pago, verificaciones de permisos o lecturas de clave de idempotencia a una réplica inmediatamente después de una escritura.

-- Terminología heredada de MySQL, aún común en flotas existentes
SHOW SLAVE STATUS\G;

-- Terminología más nueva donde sea compatible
SHOW REPLICA STATUS\G;

Verifica el motor/versión antes de estandarizar en un comando. Monitorea la salud del hilo SQL de la réplica, la salud del hilo IO y el retraso, no solo si la conexión TCP está activa.

Seguridad

CREATE USER 'app'@'%' IDENTIFIED BY 'usa-un-gestor-de-secretos';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'%';

ALTER USER 'app'@'%' REQUIRE SSL;

SELECT user, host
FROM mysql.user
WHERE user = '';

DROP USER IF EXISTS ''@'localhost';
DROP USER IF EXISTS ''@'%';

Puntos de revisión de seguridad:

  • No concedas ALL PRIVILEGES o *.* a usuarios de aplicaciones.
  • Exige TLS para usuarios de aplicaciones cuando el tráfico cruce hosts o redes.
  • Almacena credenciales en el gestor de secretos de la plataforma, no en ejemplos, scripts o archivos de repositorio.
  • Separa los usuarios de migración/administración de los usuarios de aplicaciones en tiempo de ejecución.
  • Audita la exposición de la red pública y las direcciones de enlace antes de ajustar el rendimiento.

Configuración

Ejemplo de punto de partida para un host de base de datos dedicado:

[mysqld]
innodb_buffer_pool_size = 4G
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

max_connections = 300
thread_cache_size = 50

wait_timeout = 300
interactive_timeout = 300
innodb_lock_wait_timeout = 10

slow_query_log = ON
long_query_time = 1
log_queries_not_using_indexes = ON

log_bin = mysql-bin
binlog_format = ROW
binlog_expire_logs_seconds = 604800

Trata los valores de configuración como una sugerencia para revisión, no un preajuste universal. Dimensiona la memoria, las conexiones, la retención de registros y la configuración de durabilidad según la carga de trabajo, el hardware, la política de copias de seguridad y los objetivos de recuperación.

Antipatrones

AntipatrónRiesgoMejor Patrón
SELECT * en rutas calientesSobrecarga de datos y clientes frágilesSeleccionar columnas explícitas
Paginación profunda con OFFSETEscaneos lineales y páginas lentasPaginación por keyset
Sin índice en joins por clave foráneaJoins lentos y eliminaciones con bloqueo pesadoIndexar columnas FK intencionadamente
Transacciones largasEsperas de bloqueo y gran historial de deshacerConfirmar unidades pequeñas de trabajo
DML directo contra mysql.userRiesgo de corrupción de la tabla de concesionesUsar CREATE USER, ALTER USER, DROP USER
Usuario de aplicación con permisos de administradorAlto radio de explosiónUsuario de tiempo de ejecución con mínimo privilegio
Reciclaje del pool por encima de wait_timeoutConexiones de pool obsoletasReciclar por debajo del tiempo de espera y verificar previamente
Lecturas en réplicas después de escriturasEstado obsoleto visible para el usuarioDirigir flujos de lectura-después-de-escritura al primario

Expectativas de Salida

Cuando se use esta habilidad para revisión, devuelve:

  1. Suposiciones de motor/versión.
  2. Problemas de mayor riesgo en corrección, bloqueo, seguridad y migración.
  3. Cambios exactos de SQL o código para la ruta segura.
  4. Plan de validación: EXPLAIN, simulación de migración, verificación de bloqueo/interbloqueo y criterios de reversión.
  5. Diferencias de sintaxis MySQL/MariaDB que afecten la recomendación.

Relacionado

  • Habilidad: patrones-postgres - Patrones de esquema y consulta específicos de PostgreSQL
  • Habilidad: migraciones-base-de-datos - Planificación de migraciones y seguridad en el despliegue
  • Habilidad: patrones-backend - Patrones de API y capa de servicio
  • Habilidad: revision-seguridad - Manejo de secretos, autenticación y mínimo privilegio
  • Agente: revisor-base-de-datos - Flujo de trabajo de revisión de base de datos más amplio

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

Skills relacionados