Communitygithub.com

mysql-patterns

Modèles de schémas, requêtes, indexation, transactions, réplication et pools de connexions pour bases de production MySQL et MariaDB. À utiliser lors de la conception de schémas et d'index MySQL ou MariaDB, ou en présence de requêtes, transactions ou réplicas en retard.

Qu'est-ce que mysql-patterns ?

Cette compétence fournit un ensemble de modèles et de bonnes pratiques éprouvées pour travailler avec MySQL et MariaDB dans des environnements de production. Elle couvre la conception de schémas, le choix des types de données, les stratégies d'indexation, les modèles de requêtes avancés (upsert, pagination par clé, recherche plein texte, JSON), la gestion des transactions et des verrous, la configuration des pools de connexions pour différentes plateformes (SQLAlchemy, Node.js mysql2), le diagnostic des performances, la réplication, la sécurité et la configuration du serveur. Elle met l'accent sur la vérification de la version du moteur pour adapter les recommandations (ex: syntaxe `VALUES(col)` vs alias de ligne pour `ON DUPLICATE KEY UPDATE`) et fournit des listes d'anti-patrons avec leurs risques et les alternatives. Cette compétence est utile pour les développeurs et administrateurs de bases de données qui conçoivent, migrent ou optimisent des bases MySQL/MariaDB.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Modèles MySQL (MySQL Patterns)

Utilisez cette compétence lorsque vous travaillez sur la conception de schémas MySQL ou MariaDB, les migrations, l'investigation de requêtes lentes, les transactions de type file d'attente, les pools de connexions ou la configuration de bases de données de production. Privilégiez la vérification exacte de la version avant d'appliquer un modèle spécifique à une fonctionnalité, car MySQL et MariaDB ont divergé sur plusieurs détails SQL.

Activation

  • Conception de tables, index et contraintes MySQL ou MariaDB
  • Révision de migrations avant leur exécution sur de grandes tables de production
  • Débogage de requêtes lentes, d'attentes de verrou, d'interblocages ou d'épuisement des connexions
  • Ajout de pagination par clé, d'upserts, de recherche plein texte, de colonnes JSON ou de files d'attente
  • Configuration des pools de connexions applicatives, des réplicas de lecture, de TLS ou des journaux de requêtes lentes

Vérification de version

Commencez par identifier le moteur et la version :

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

Gardez les conseils pour MySQL et MariaDB séparés lorsque la syntaxe diffère :

  • Les documents MySQL présentent les alias de ligne comme le remplacement de VALUES(col) dans ON DUPLICATE KEY UPDATE ; VALUES(col) y est déprécié.
  • Les documents MariaDB présentent VALUES(col) comme la méthode prise en charge pour référencer les valeurs insérées dans ON DUPLICATE KEY UPDATE ; utilisez-la pour la compatibilité entre moteurs.
  • SKIP LOCKED est approprié uniquement pour les tâches de type file d'attente. Il ignore les lignes verrouillées et peut renvoyer une vue incohérente, donc ne l'utilisez pas pour la comptabilité générale ou les lectures sensibles à l'intégrité.

Valeurs par défaut des schémas

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;

Choix par défaut :

Cas d'utilisationPréférezÉvitez
Clés primaires de substitutionBIGINT UNSIGNED AUTO_INCREMENTINT pour les tables pouvant dépasser 2B lignes
Clés de recherche UUIDBINARY(16) avec fonctions de conversionVARCHAR(36) comme clé primaire sur les tables chaudes
Argent et quantités exactesDECIMAL(p, s)FLOAT ou DOUBLE
Texte destiné à l'utilisateurTables et index utf8mb4Les valeurs par défaut MySQL utf8 / utf8mb3
Horodatages applicatifsDATETIME avec UTC géré par l'applicationSupposer que DATETIME stocke des métadonnées de fuseau horaire
Suppressions logiquesdeleted_at DATETIME NULL plus index filtrésFiltrer les lignes supprimées logiquement sans index
Valeurs de statut extensiblestable de référence ou VARCHAR contraintENUM lorsque les valeurs changent souvent

Indexation

L'ordre des index composites suit généralement d'abord les prédicats d'égalité, puis les colonnes de plage ou de tri :

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;

Utilisez EXPLAIN avant d'ajouter ou de modifier un index :

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

Signaux à examiner :

ChampSignal de risque
typeALL sur une grande table
keyNULL lorsqu'il existe un prédicat sélectif
rowsEstimation de lignes très élevée pour un chemin interactif
ExtraUsing temporary, Using filesort ou Using where étendu

Évitez d'ajouter des index aveuglément. Chaque index augmente le coût d'écriture, le temps de migration, la taille de sauvegarde et la pression sur le pool de buffers.

Modèles de requêtes

Upsert

Forme compatible entre moteurs :

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

Forme avec alias de ligne 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;

Utilisez la forme avec alias de ligne uniquement après avoir confirmé que la cible est MySQL. Utilisez VALUES(col) pour MariaDB ou les parcs mixtes MySQL/MariaDB.

Pagination par clé (Keyset Pagination)

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

Accompagnez-la d'un index correspondant à la clé de pagination :

CREATE INDEX idx_products_created_id ON products (created_at, id);

N'utilisez pas la pagination profonde avec OFFSET sur les grandes tables ; elle force le serveur à analyser et à ignorer des lignes avant de renvoyer la page.

Champs JSON

Utilisez les colonnes JSON pour les données d'extension, pas pour les champs nécessitant un filtrage relationnel lourd ou des contraintes.

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;

Pour les chemins JSON fréquemment interrogés, exposez une colonne générée et indexez cette colonne. Conservez les clés étrangères, la propriété, la multitenance et les champs de cycle de vie en tant que colonnes relationnelles.

Recherche plein texte

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;

Utilisez un moteur de recherche externe lorsque vous avez besoin de tolérance aux fautes de frappe, d'un classement complexe, de facettes inter-tables ou d'une analyse linguistique au-delà du comportement intégré de la recherche plein texte.

Transactions

Gardez les transactions courtes et verrouillez les lignes dans un ordre cohérent :

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;

Liste de vérification pour les interblocages et les attentes de verrou :

  • Verrouillez les lignes dans un ordre déterministe à travers les chemins de code.
  • Effectuez les appels API externes avant d'ouvrir la transaction, pas à l'intérieur.
  • Ajoutez des index pour les prédicats utilisés dans les instructions UPDATE, DELETE et les lectures avec verrouillage.
  • En cas d'interblocage, annulez et réessayez la transaction entière avec un budget de tentatives limité.
  • Exécutez SHOW ENGINE INNODB STATUS\G peu après un interblocage ; il est écrasé par les événements ultérieurs.

Réclamation de tâche de type file d'attente :

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;

Utilisez SKIP LOCKED uniquement pour les charges de travail de type file d'attente où ignorer une ligne verrouillée est acceptable. Ce n'est pas un remplacement pour la cohérence transactionnelle normale.

Pools de connexions

Exemple 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},
)

Exemple 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],
);

Gardez le recyclage du pool applicatif en dessous du wait_timeout du serveur. Si le serveur utilise wait_timeout = 300, un pool_recycle autour de 240 secondes est cohérent ; pool_pre_ping aide toujours à récupérer des événements réseau et de basculement.

Diagnostic

Commandes de premier passage utiles :

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

Activez le journal des requêtes lentes dans un environnement contrôlé :

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

Utilisez EXPLAIN ANALYZE uniquement lorsqu'il est sûr d'exécuter la requête. Il exécute l'instruction et peut être coûteux sur des données de taille production.

Réplication

Les réplicas de lecture peuvent avoir un retard. N'acheminer pas les chemins de lecture-après-écriture, les flux de paiement, les vérifications de permissions ou les lectures de clé d'idempotence vers un réplica immédiatement après une écriture.

-- Terminologie MySQL héritée, encore courante dans les parcs existants
SHOW SLAVE STATUS\G;

-- Terminologie plus récente là où elle est prise en charge
SHOW REPLICA STATUS\G;

Vérifiez le moteur/la version avant de vous standardiser sur une commande. Surveillez la santé du thread SQL du réplica, du thread IO et le retard, pas seulement si la connexion TCP est active.

Sécurité

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 ''@'%';

Points de vérification de sécurité :

  • N'accordez pas ALL PRIVILEGES ou *.* aux utilisateurs applicatifs.
  • Exigez TLS pour les utilisateurs applicatifs lorsque le trafic traverse des hôtes ou des réseaux.
  • Stockez les identifiants dans le gestionnaire de secrets de la plateforme, pas dans des exemples, des scripts ou des fichiers de dépôt.
  • Séparez les utilisateurs de migration/administration des utilisateurs applicatifs d'exécution.
  • Auditez l'exposition réseau publique et les adresses de liaison avant de régler les performances.

Configuration

Exemple de point de départ pour un hôte de base de données dédié :

[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

Considérez les valeurs de configuration comme une incitation à la révision, pas comme un préréglage universel. Dimensionnez la mémoire, les connexions, la rétention des journaux et les paramètres de durabilité en fonction de la charge de travail, du matériel, de la politique de sauvegarde et des objectifs de récupération.

Anti-patrons

Anti-patronRisqueMeilleur patron
SELECT * dans les chemins chaudsSurcharge de lecture et clients fragilesSélectionnez des colonnes explicites
Pagination profonde avec OFFSETAnalyses linéaires et pages lentesPagination par clé
Pas d'index sur les jointures de clés étrangèresJointures lentes et suppressions avec verrous lourdsIndexez intentionnellement les colonnes FK
Transactions longuesAttentes de verrou et historique d'annulation volumineuxValidez de petites unités de travail
DML direct sur mysql.userRisque de corruption de la table des privilègesUtilisez CREATE USER, ALTER USER, DROP USER
Utilisateur applicatif avec droits adminRayon d'explosion élevéUtilisateur d'exécution avec le moins de privilèges
Recyclage du pool au-dessus de wait_timeoutConnexions périmées dans le poolRecyclez en dessous du délai d'attente et pré-vérifiez
Lectures sur réplica après écrituresÉtat utilisateur obsolèteVerrouillez les flux de lecture-après-écriture sur le primaire

Résultats attendus

Lorsque cette compétence est utilisée pour une révision, renvoyez :

  1. Les hypothèses sur le moteur/la version.
  2. Les problèmes de plus haut risque liés à la correction, aux verrous, à la sécurité et aux migrations.
  3. Les modifications exactes de SQL ou de code pour le chemin sûr.
  4. Le plan de validation : EXPLAIN, simulation de migration, vérification des verrous/interblocages et critères de retour arrière.
  5. Toute différence de syntaxe MySQL/MariaDB affectant la recommandation.

Voir aussi

  • Compétence : postgres-patterns - Modèles de schémas et de requêtes spécifiques à PostgreSQL
  • Compétence : database-migrations - Planification des migrations et sécurité de déploiement
  • Compétence : backend-patterns - Modèles d'API et de couche de service
  • Compétence : security-review - Gestion des secrets, authentification et moindre privilège
  • Agent : database-reviewer - Flux de révision de base de données plus large

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 associés