đïž ALTER TABLE â Modifier la structure
Ajouter / Modifier / Supprimer des colonnes
-- Ajouter une colonne
ALTER TABLE clients ADD COLUMN telephone VARCHAR(20) NULL;
ALTER TABLE clients ADD COLUMN deleted_at DATETIME NULL AFTER email;
-- Modifier le type ou les options d'une colonne
ALTER TABLE clients MODIFY COLUMN ville VARCHAR(150) NOT NULL DEFAULT 'non_renseigne';
-- Renommer une colonne (MySQL 8.0+)
ALTER TABLE produits RENAME COLUMN poids_kg TO poids;
-- Supprimer une colonne
ALTER TABLE clients DROP COLUMN telephone;
-- Plusieurs modifications en une seule requĂȘte (atomique)
ALTER TABLE produits
ADD COLUMN description TEXT NULL,
MODIFY COLUMN prix DECIMAL(12, 2) NOT NULL,
ADD INDEX idx_nom (nom);
Renommer une table
RENAME TABLE produits TO articles;
-- ou
ALTER TABLE produits RENAME TO articles;
En production, un
ALTER TABLE sur une grande table peut verrouiller la table plusieurs minutes. Utilisez des outils comme pt-online-schema-change ou MySQL 8.0 Online DDL pour les tables de millions de lignes.đ Index â AccĂ©lĂ©rer les requĂȘtes
Un index est une structure de données (B-Tree par défaut) qui permet à MySQL de trouver des lignes sans scanner toute la table.
-- Créer un index simple
CREATE INDEX idx_produits_prix ON produits(prix);
-- Index UNIQUE (interdit les doublons)
CREATE UNIQUE INDEX idx_clients_email ON clients(email);
-- Index composite (multi-colonnes)
CREATE INDEX idx_commandes_client_statut ON commandes(client_id, statut);
-- Index FULLTEXT (pour la recherche textuelle)
CREATE FULLTEXT INDEX idx_produits_nom ON produits(nom, description);
-- Supprimer un index
DROP INDEX idx_produits_prix ON produits;
-- Voir les index d'une table
SHOW INDEX FROM produits;
đ Types d'index
| Type | Usage | Particularité |
|---|---|---|
PRIMARY KEY | Identifiant unique de la ligne | Clustered index (les données sont triées par la PK) |
UNIQUE | Valeur unique, NULL autorisé | Plusieurs NULL possibles |
INDEX | Accélération des recherches | Doublons autorisés |
FULLTEXT | Recherche textuelle (MATCH AGAINST) | InnoDB MySQL 5.6+ |
| Composite | RequĂȘtes sur plusieurs colonnes | RĂšgle du prĂ©fixe gauche |
RÚgle du préfixe gauche
-- Index composite : (client_id, statut)
CREATE INDEX idx ON commandes(client_id, statut);
-- UTILISE l'index (préfixe gauche respecté)
SELECT * FROM commandes WHERE client_id = 1;
SELECT * FROM commandes WHERE client_id = 1 AND statut = 'livree';
-- N'UTILISE PAS l'index (col gauche absente)
SELECT * FROM commandes WHERE statut = 'livree';
đŹ EXPLAIN â Analyser les requĂȘtes
EXPLAIN affiche le plan d'exĂ©cution sans exĂ©cuter la requĂȘte.
EXPLAIN SELECT * FROM produits WHERE prix > 500;
EXPLAIN SELECT p.nom, c.nom FROM produits p JOIN categories c ON p.categorie_id = c.id;
| Colonne | Signification |
|---|---|
type | Type d'accĂšs : ALL (scan complet) â ref â range â const (meilleur) |
key | Index utilisé (NULL = aucun) |
rows | Nombre de lignes examinées (estimation) |
Extra | Infos supplémentaires : Using index, Using filesort... |
-- EXPLAIN ANALYZE (MySQL 8.0.18+) : exécute ET mesure
EXPLAIN ANALYZE SELECT * FROM produits WHERE categorie_id = 1;
Si
type = ALL et rows est grand â ajoutez un index sur la colonne filtrĂ©e. Si Extra = Using filesort â un index sur la colonne ORDER BY peut aider.⥠RĂšgles d'optimisation
- Indexez les colonnes de WHERE, JOIN ON et ORDER BY fréquemment utilisées
- Ăvitez les fonctions sur les colonnes indexĂ©es dans WHERE :
WHERE YEAR(created_at) = 2024n'utilise pas l'index surcreated_at. UtilisezWHERE created_at BETWEEN '2024-01-01' AND '2024-12-31' - Limitez le nombre d'index : chaque index ralentit les INSERT/UPDATE/DELETE
- Utilisez DECIMAL pour les montants, pas FLOAT
- Ăvitez SELECT * : sĂ©lectionnez seulement les colonnes nĂ©cessaires
-- Mauvais : empĂȘche l'utilisation de l'index
SELECT * FROM commandes WHERE YEAR(date_commande) = 2024;
-- Bon : l'index sur date_commande peut ĂȘtre utilisĂ©
SELECT * FROM commandes
WHERE date_commande >= '2024-01-01'
AND date_commande < '2025-01-01';
đ Introspection de la base
-- Structure d'une table
DESCRIBE produits;
SHOW COLUMNS FROM produits;
-- DDL complet (CREATE TABLE avec tous les index et FK)
SHOW CREATE TABLE commandes;
-- Tous les index d'une table
SHOW INDEX FROM produits;
-- Tables et leur statut (taille, moteur, lignes...)
SHOW TABLE STATUS FROM formation_mysql;
-- Variables de configuration
SHOW VARIABLES LIKE '%innodb%';
SHOW VARIABLES LIKE 'max_connections';
-- Processus en cours
SHOW PROCESSLIST;