Communitygithub.com

patrones-mysql

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

¿Qué es patrones-mysql?

Este skill proporciona una guía exhaustiva y práctica para diseñar y operar bases de datos MySQL y MariaDB en entornos de producción. Cubre desde la creación de esquemas con tipos de datos óptimos y elección de collations, hasta patrones de indexación compuestos, paginación con keyset, upserts compatibles entre motores, manejo de campos JSON con columnas generadas, y búsqueda de texto completo. Incluye buenas prácticas para transacciones (corto alcance, orden de bloqueo determinista, uso de SKIP LOCKED para colas), configuración de pools de conexión (con ejemplos en Python SQLAlchemy y Node.js mysql2), comandos de diagnóstico (SHOW PROCESSLIST, EXPLAIN, slow log), verificación de réplicas y seguridad (usuarios SSL, privilegios mínimos). También detalla parámetros de configuración típicos y una tabla de antipatrones con riesgos y soluciones. Es útil para revisores de esquemas, consultas lentas, transacciones con bloqueos, configuraciones de réplica y puesta a punto de rendimiento. Soporta tanto MySQL como MariaDB, indicando diferencias de sintaxis (como VALUES vs row alias en ON DUPLICATE KEY UPDATE) y la necesidad de verificar la versión antes de aplicar patrones específicos.

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

Preguntar en tu IA favorita

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

Documentación

Patrones de MySQL

Use este skill cuando trabaje en diseño de esquemas MySQL o MariaDB, migraciones, investigación de consultas lentas, transacciones tipo cola, pools de conexión o configuración de bases de datos en producción. Prefiera verificar la versión exacta antes de aplicar un patrón específico de una característica, ya que MySQL y MariaDB han divergido en varios detalles de SQL.

Activación

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

Verificación de Versión

Comience identificando el motor y la versión:

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

Mantenga separadas las guías de MySQL y MariaDB cuando la sintaxis difiera:

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

Valores por Defecto del Esquema

CREATE TABLE orders (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    account_id BIGINT UNSIGNED NOT NULL,
    status VARCHAR(32) NOT NULL,
    total DECIMAL(15, 2) NOT NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted_at DATETIME NULL,
    PRIMARY KEY (id),
    KEY idx_orders_account_status_created (account_id, status, created_at),
    KEY idx_orders_active (account_id, deleted_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Opciones predeterminadas:

Caso de UsoPreferirEvitar
Claves primarias sustitutasBIGINT UNSIGNED AUTO_INCREMENTINT para tablas que puedan crecer más de 2B filas
Claves de búsqueda UUIDBINARY(16) con funciones de conversiónVARCHAR(36) como clave primaria en tablas calientes
Dinero y cantidades exactasDECIMAL(p, s)FLOAT o DOUBLE
Texto visible para el usuariotablas e índices utf8mb4Valores predeterminados utf8 / utf8mb3 de MySQL
Marcas de tiempo de aplicaciónDATETIME con UTC gestionado por la appAsumir que DATETIME almacena metadatos de zona horaria
Borrado suavedeleted_at DATETIME NULL más índices con ámbitoFiltrar filas borradas suavemente sin índice
Valores de estado extensiblestabla de referencia o VARCHAR restringidoENUM cuando los valores cambian a menudo

Indexación

El orden del índice compuesto suele seguir primero los predicados de igualdad, luego las columnas de rango u orden:

CREATE INDEX idx_orders_account_status_created
    ON orders (account_id, status, created_at);

SELECT id, total
FROM orders
WHERE account_id = ?
  AND status = 'pending'
  AND created_at >= ?
ORDER BY created_at DESC
LIMIT 50;

Use EXPLAIN antes de agregar o cambiar un índice:

EXPLAIN
SELECT id, total
FROM orders
WHERE account_id = 123 AND status = 'pending'
ORDER BY created_at DESC
LIMIT 50;

Señales a 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

Evite 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 buffer pool.

Patrones de Consulta

Upsert

Forma compatible entre motores:

INSERT INTO user_settings (user_id, setting_key, setting_value)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
    setting_value = VALUES(setting_value),
    updated_at = CURRENT_TIMESTAMP;

Forma con alias de fila de MySQL:

INSERT INTO user_settings (user_id, setting_key, setting_value)
VALUES (?, ?, ?) AS new
ON DUPLICATE KEY UPDATE
    setting_value = new.setting_value,
    updated_at = CURRENT_TIMESTAMP;

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

Paginación con Keyset

SELECT id, name, created_at
FROM products
WHERE (created_at, id) < (?, ?)
ORDER BY created_at DESC, id DESC
LIMIT 50;

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

CREATE INDEX idx_products_created_id ON products (created_at, id);

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

Campos JSON

Use columnas JSON para datos de extensión, no para campos que requieran filtrado relacional intensivo o restricciones.

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

Para rutas JSON consultadas con frecuencia, exponga una columna generada e indexe esa columna. Mantenga las claves foráneas, la propiedad, la tenencia y los campos de ciclo de vida como relacionales.

Búsqueda de Texto Completo

ALTER TABLE articles ADD FULLTEXT KEY ft_articles_title_body (title, body);

SELECT id, title, MATCH(title, body) AGAINST (? IN NATURAL LANGUAGE MODE) AS score
FROM articles
WHERE MATCH(title, body) AGAINST (? IN NATURAL LANGUAGE MODE)
ORDER BY score DESC
LIMIT 20;

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

Transacciones

Mantenga las transacciones cortas y bloquee las filas en un orden consistente:

START TRANSACTION;

SELECT id, balance
FROM accounts
WHERE id IN (?, ?)
ORDER BY id
FOR UPDATE;

UPDATE accounts SET balance = balance - ? WHERE id = ?;
UPDATE accounts SET balance = balance + ? WHERE id = ?;

COMMIT;

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

  • Bloquee filas en un orden determinista en todas las rutas de código.
  • Realice llamadas a API externas antes de abrir la transacción, no dentro de ella.
  • Agregue índices para los predicados usados en UPDATE, DELETE y lecturas con bloqueo.
  • Ante un interbloqueo, revierta y reintente toda la transacción con un presupuesto de reintentos limitado.
  • Capture 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 jobs
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;

UPDATE jobs
SET status = 'processing', started_at = CURRENT_TIMESTAMP
WHERE id = ?;

COMMIT;

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

Pools de Conexión

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 orders WHERE account_id = ? LIMIT 50',
  [accountId],
);

Mantenga 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 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 útiles de primera pasada:

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

Active el registro lento en un entorno controlado:

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

Use 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 lectura pueden tener retraso. No enrute rutas de lectura-después-de-escritura, flujos de pago, comprobaciones 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;

Verifique el motor/versión antes de estandarizar en un comando. Monitoree 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 'use-a-secret-manager';
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 conceda ALL PRIVILEGES o *.* a usuarios de aplicación.
  • Exija TLS para usuarios de aplicación cuando el tráfico cruce hosts o redes.
  • Almacene credenciales en el gestor de secretos de la plataforma, no en ejemplos, scripts o archivos de repositorio.
  • Separe los usuarios de migración/administración de los usuarios de aplicación en tiempo de ejecución.
  • Audite la exposición de 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

Trate los valores de configuración como una sugerencia para revisión, no como un valor preestablecido universal. Ajuste 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 críticasSobrerecuperación y clientes frágilesSeleccionar columnas explícitas
Paginación profunda con OFFSETEscaneos lineales y páginas lentasPaginación con keyset
Sin índice en joins de clave foráneaJoins lentos y eliminaciones con bloqueo intensivoIndexar columnas FK intencionalmente
Transacciones largasEsperas de bloqueo e historial de deshacer grandeConfirmar unidades pequeñas de trabajo
DML directo contra mysql.userRiesgo de corrupción de tablas de concesiónUsar 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 obsoletas en el poolReciclar por debajo del tiempo de espera y verificar antes de usar
Lecturas en réplica después de escriturasEstado obsoleto visible para el usuarioDirigir flujos de lectura-después-de-escritura al primario

Resultados Esperados

Cuando este skill se use para una revisión, devuelva:

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

Relacionados

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

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/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

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.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados