MySQL 8.0 : Fonctionnalités avancées pour les développeurs et administrateurs

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 TABLE ou TRUNCATE TABLE sont 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é que mysql_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_history et password_reuse_interval.

6. JSON amélioré

Au-delà du support natif introduit en 5.7, MySQL 8.0 ajoute :

  • JSON_ARRAYAGG() et JSON_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 par AES_ENCRYPT()/AES_DECRYPT() et SHA2().
  • Procédure d’initialisation obsolète : mysql_install_db remplacé par mysqld --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 tables GLOBAL_STATUS/SESSION_STATUS ont été retirées au profit de performance_schema.

Optimisations sous-jacentes

MySQL 8.0 intègre également des améliorations invisibles mais critiques :

  • Moteur temporaire par défaut : TempTable remplace MEMORY pourr les tables internes — meilleure gestion mémoire et support natif de VARCHAR/VARBINARY.
  • Système de logs modulaire : log_error_services permet de chaîner des composants de filtrage, formatage et sortie (fichier, syslog, …).
  • Sauvegardes en ligne robustes : LOCK INSTANCE FOR BACKUP permet des opérations DML pendant la sauvegarde, tout en bloquant les modifications structurelles pouvant compromettre la cohérence du snapshot.

Étiquettes: MySQL8 window-functions cte InnoDB JSON

Publié le 4 octobre à 16h35