MySQL 8.0 marque une évolution majeure par rapport aux versions précédentes, introduisant des fonctionnalités profondément intégrées au cœur du moteur de stockage, à l’optimiseur et au système de gestion des métadonnées. Cette version n’est pas une simple mise à jour incrémentale : elle repose sur une refonte architecturale visant la robustesse transactionnelle, la flexibilité analytique et la sécurité opérationnelle.
Fonctionnalités clés modernes
1. Expressions de fenêtre (Window Functions)
Les fonctions de fenêtre permettent d’exécuter des calculs agrégés ou de classement sans réduire le nombre de lignes du jeu de résultats — contrairement aux agrégats classiques avec GROUP BY. Elles s’appliquent à des sous-ensembles logiques définis dynamiquement via PARTITION BY et ORDER BY.
Exemple concret : calculer simultanément le chiffre d’affaires par région, le total global et les parts relatives — le tout dans une seule requête :
CREATE TABLE sales_data (
id INT PRIMARY KEY AUTO_INCREMENT,
region VARCHAR(20),
district VARCHAR(20),
revenue DECIMAL(12,2)
);
INSERT INTO sales_data (region, district, revenue) VALUES
('Pékin', 'Haidian', 10000.00),
('Pékin', 'Chaoyang', 20000.00),
('Shanghai', 'Huangpu', 30000.00),
('Shanghai', 'Changning', 10000.00);
SELECT
region AS région,
district AS district,
revenue AS revenu_local,
SUM(revenue) OVER (PARTITION BY region) AS revenu_régional,
ROUND(revenue / SUM(revenue) OVER (PARTITION BY region), 4) AS part_régionale,
SUM(revenue) OVER () AS revenu_global,
ROUND(revenue / SUM(revenue) OVER (), 4) AS part_globale
FROM sales_data
ORDER BY région, district;
Cette approche élimine le besoin de tables temporaires ou de jointures complexes, améliorant à la fois la lisibilité et les performances.
2. Expressions de table commune (CTE)
Les CTE (Common Table Expressions) offrent une syntaxe claire pour structurer des requêtes complexes. MySQL 8.0 supporte à la fois les formes non récursives et récursives.
CTE non récursive : utile pour factoriser des sous-requêtes réutilisables.
WITH active_regions AS (
SELECT DISTINCT region FROM sales_data WHERE revenue > 5000
)
SELECT d.*
FROM departments d
INNER JOIN active_regions r ON d.region_code = r.region;
CTE récursive : indispensable pour naviguer dans des hiérarchies (organigrammes, catégories imbriquées, etc.). Elle combine une requête initiale (seed) et une requête récursive liée via UNION ALL.
WITH RECURSIVE org_tree AS (
-- Seed: dirigeants sans supérieur
SELECT employee_id, last_name, manager_id, 1 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- Recursive step: descendre dans la hiérarchie
SELECT e.employee_id, e.last_name, e.manager_id, ot.level + 1
FROM employees e
INNER JOIN org_tree ot ON e.manager_id = ot.employee_id
WHERE ot.level < 5 -- limite de profondeur pour prévenir les boucles
)
SELECT employee_id, last_name, level
FROM org_tree
WHERE level >= 3;
3. Améliorations du moteur InnoDB
- DDL atomique : Les opérations comme
ALTER TABLE,DROP TABLEouTRUNCATE TABLEsont désormais entièrement transactionnelles — aucune corruption partielle en cas de plantage. - Index cachés : Permettent de désactiver temporairement un index pour tester son impact sur les performances, sans suppression physique.
- Index décroissants natifs : Support explicite de
INDEX(col DESC), optimisant les tri multi-colonnes avec ordres mixtes. - Gestion fine des verrous : Meilleure détection des interblocages et amélioration de la contention sur les verrous partagés.
4. Dictionnaire de données transactionnel
Remplaçant les anciens fichiers de métadonnées non transactionnels (comme .frm), le dictionnaire est désormais stocké dans des tables InnoDB internes. Cela garantit la cohérence ACID des objets schématiques (tables, vues, procédures) et rend INFORMATION_SCHEMA plus fiable et performant.
5. Sécurité renforcée
- Plugin d’authentification par défaut :
caching_sha2_password, plus sécurisé quemysql_native_password. - Rôles granulaires : Gestion centralisée des privilèges via
CREATE ROLE,GRANT role TO user. - Historique des mots de passe : Empêche la réutilisation récente grâce à
password_historyetpassword_reuse_interval.
6. JSON amélioré
Au-delà du support natif introduit en 5.7, MySQL 8.0 ajoute :
JSON_ARRAYAGG()etJSON_OBJECTAGG()pour agréger des colonnes en documents JSON.- L’opérateur
->>pour extraire des valeurs scalaires avec conversion automatique (ex. :data->>"$.price"renvoie un nombre, pas une chaîne). - Des fonctions de recherche et remplacement :
JSON_SEARCH(),JSON_REPLACE(),JSON_SET().
7. Gestion des ressources
Le moteur permet d’assigner des threads serveur à des groupes prédéfinis avec des contraintes CPU (via VIRTUAL CPU). Exemple :
CREATE RESOURCE GROUP rg_analytics
TYPE = USER
VCPU = 2-3
THREAD_PRIORITY = 19;
ALTER RESOURCE GROUP rg_analytics ENABLE;
-- Assigner une session au groupe
SET RESOURCE GROUP rg_analytics;
Cela isole les charges analytiques intensives des requêtes OLTP critiques.
Régressions et suppressions notables
MySQL 8.0 supprime plusieurs fonctionnalités obsolètes pour simplifier l’architecture et améliorer la stabilité :
- Mise en cache des requêtes : Supprimée complètement (
query_cache_*variables,FLUSH QUERY CACHE). - Fonctions cryptographiques dépréciées :
ENCODE(),DES_ENCRYPT()remplacées parAES_ENCRYPT()/AES_DECRYPT()etSHA2(). - Procédure d’initialisation obsolète :
mysql_install_dbremplacé parmysqld --initialize. - Partitionnement générique : Seul InnoDB (et NDB dans certaines éditions) gère nativement le partitionnement.
- Variables obsolètes :
have_crypt,show_compatibility_56, et les tablesGLOBAL_STATUS/SESSION_STATUSont été retirées au profit deperformance_schema.
Optimisations sous-jacentes
MySQL 8.0 intègre également des améliorations invisibles mais critiques :
- Moteur temporaire par défaut :
TempTableremplaceMEMORYpourr les tables internes — meilleure gestion mémoire et support natif deVARCHAR/VARBINARY. - Système de logs modulaire :
log_error_servicespermet de chaîner des composants de filtrage, formatage et sortie (fichier, syslog, …). - Sauvegardes en ligne robustes :
LOCK INSTANCE FOR BACKUPpermet des opérations DML pendant la sauvegarde, tout en bloquant les modifications structurelles pouvant compromettre la cohérence du snapshot.