MySQL 5€ ISBN : 978-2-7460-9018-7 MySQL 5.6 Performances et Tuning MySQL 5.6 Vincent TAHON -...

29
MySQL 5.6 Performances et Tuning Vincent TAHON

Transcript of MySQL 5€ ISBN : 978-2-7460-9018-7 MySQL 5.6 Performances et Tuning MySQL 5.6 Vincent TAHON -...

ISB

N :

978-

2-74

60-9

018-

7

39 €

MySQL 5.6 Performances et Tuning

Vincent TAHON MyS

QL

5.6

- P

erfo

rman

ces

et T

unin

g

MySQL 5.6 Performances et Tuning

Vincent TAHON est Architecte technique et applicatif, Expert en Bases de données. Il est certifié Oracle et MySQL et dispense tout le cursus officiel des cours MySQL auprès de professionnels en entre-prise. En tant qu’expert il réalise des audits de performances pour de grands comptes et des sites à haute valeur ajoutée sur des archi-tectures MySQL complexes et hétérogènes. Cette double compé-tence, technique et pédagogique, lui permet de guider le lecteur sur des voies et solutions pour ré-pondre aux enjeux de développe-ment des entreprises d’aujourd’hui.

Ce livre sur l’exploitation des bases de données MySQL (versions 5.1 à 5.6) s’adresse aux architectes et administrateurs de bases de données, aux chefs de projets techniques et bien entendu à tous les développeurs qui souhaitent utiliser de façon pertinente et efficace toutes les fonc-tionnalités de ce serveur et aussi écrire des requêtes optimisées.Le livre intègre les nouveautés de la version 5.6 et propose des solutions d’analyses techniques pour permettre de tirer un maximum de perfor-mances de MySQL Server.L’auteur décrit la méthodologie pour identifier les problèmes au niveau de l’exécution de requêtes et décrit également comment analyser cor-rectement le moteur de données pour le configurer de façon optimale (les besoins en mémoire / buffers et les besoins transactionnels, buffers logs / redo logs…) notamment avec le moteur InnoDB.Un autre aspect de l’architecture MySQL repose sur l’adéquation entre le besoin en données et le support physique adopté. L’auteur propose donc au lecteur d’apprendre à dimensionner correctement les mémoires nécessaires, à gérer le calibrage des I/O sur disques, par rapport à l’architecture physique et au système d’exploitation et enfin à configurer les exécutions en mode multi-thread en fonction du nombre de cores supportés par l’environnement hôte.La haute performance est décrite avec la réplication bi-directionnelle ainsi que la haute disponibilité avec la mise en œuvre de solutions cluster système et du produit MySQL Cluster 7.3. Enfin, le besoin en données de type Big Data, de ressources dans un Cloud, sont autant de demandes auxquelles l’auteur répond en présentant les solutions MySQL 5.6 existantes.Les scripts proposés en téléchargement sur le site www.editions-eni.fr sont des exemples de mises en œuvre des bonnes pratiques conseil-lées dans l’ouvrage, notamment des scénarios d’écriture de requêtes optimisées.

Avant-propos • Introduction à MySQL • Architecture MySQL • Concept de performance • Conception et analyse de performance • Indexation • Partitionnement • Tuning des requêtes • MySQL Cache et cache sys-tème • Configuration de MySQL Server • Caractéristiques avancées des objets MySQL • Gestion d’un moteur de stockage • Moteur de stockage InnoDB • Prise en compte de l’environnement • Haute performance MySQL (réplication) • Haute disponibilité MySQL (cluster) • MySQL et le Big Data

Les chapitres du livre

Pour plus d’informations :

Téléchargementwww.editions-eni.fr.fr

Sur www.editions-eni.fr :b Scripts d’exemples.b Scénarios pour

des requêtes optimisées.

1Table des matières

Avant-propos

Chapitre 1Introduction à MySQL

1. Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2. Historique de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3. Liste des produits MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

4. Liste des environnements supportés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

5. Les certifications MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

6. Documentation en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Chapitre 2Architecture MySQL

1. Présentation de l'architecture MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2. Architecture client/serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.1 Programme client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.2 Programme non client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.3 Programme serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

3. Concept client/serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1 Processus serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.2 Processus de connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.3 Couche de connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.4 Protocoles de communication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Les éléments à télécharger sont disponibles à l'adresse suivante : http://www.editions-eni.fr 

Saisissez la référence ENI de l'ouvrage EI56MYS dans la zone de recherche et validez. Cliquez sur le titre du livre puis sur le bouton de téléchargement.

2Performances et tuning

MySQL 5.6

4. Concept de traitement d'information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.1 Processus SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.2 Couche SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5. Concept des moteurs de stockage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.1 Présentation des moteurs de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . 395.2 Couche de stockage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6. Concept des mémoires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436.1 Présentation des mémoires dans MySQL . . . . . . . . . . . . . . . . . . . . . . . 43

6.1.1 Mémoire globale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436.1.2 Mémoire de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

6.2 Structure des mémoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

7. Contrôle d'accès concurrentiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467.1 Explication du contrôle de cohérence . . . . . . . . . . . . . . . . . . . . . . . . . . 467.2 Gestion des verrous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

7.2.1 Verrou de lecture et d'écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . 477.2.2 Granularité des verrous . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

7.3 Multiversion Concurrency Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Chapitre 3Concept de performance

1. Terminologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2. Planification d'une analyse comparative . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.1 Étudier les profils d'analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.2 Établir une tactique d'analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532.3 Établir des résultats précis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

3. Étape de test de performances. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543.1 Définition des tests de performances. . . . . . . . . . . . . . . . . . . . . . . . . . . 553.2 Liste des tests de performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

4. Diagnostiquer un problème. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.1 Obtenir des informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.2 Problème de tuning SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.3 Rôle de l'administrateur de données . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3Table des matières

5. Déployer des sessions de tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585.1 Capturer les performances du système d'exploitation . . . . . . . . . . . . . 585.2 Capturer les performances des applications . . . . . . . . . . . . . . . . . . . . . 595.3 Capturer les statuts du système de données MySQL Server . . . . . . . . 61

Chapitre 4Conception et analyse de performance

1. Liste des utilitaires de surveillance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711.1 Utilitaires système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711.2 Utilitaires MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

2. Outils d'administration MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752.1 MySQL Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752.2 MySQL Workbench . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

3. Module de stress de base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.1 Présentation du stress de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.2 Procédé système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

3.2.1 Utilitaire sysbench. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773.2.2 Utilitaire SAR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

3.3 Procédé MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.3.1 Utilitaire MySQL sql-bench . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793.3.2 Utilitaire mysqlslap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

4. Savoir utiliser les types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824.1 Déterminer le poids de stockage des lignes . . . . . . . . . . . . . . . . . . . . . . 824.2 Évaluer le type de données dans une table . . . . . . . . . . . . . . . . . . . . . . 834.3 Utiliser la procédure ANALYSE sur un jeu de données . . . . . . . . . . . . 84

5. Commandes spécifiques de surveillance MySQL . . . . . . . . . . . . . . . . . . . . . 855.1 Surveiller les threads MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855.2 Surveiller les moteurs MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

5.2.1 Surveiller l'activité des moteurs MySQL . . . . . . . . . . . . . . . . . . 855.2.2 Surveiller le poids des moteurs MySQL . . . . . . . . . . . . . . . . . . . 86

6. Analyses des traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866.1 Traces de l'instance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 866.2 Traces des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

4Performances et tuning

MySQL 5.6

7. Utilisation de MySQL Enterprise Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . 887.1 Description de MySQL Enterprise Monitor . . . . . . . . . . . . . . . . . . . . . 887.2 Fonctionnalités de MySQL Enterprise Monitor . . . . . . . . . . . . . . . . . . 89

7.2.1 Fonctionnalités des systèmes . . . . . . . . . . . . . . . . . . . . . . . . . . . 897.2.2 Fonctionnalités des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907.2.3 Fonctionnalités de performances . . . . . . . . . . . . . . . . . . . . . . . . 907.2.4 Fonctionnalités dans un Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . 91

8. Utilisation de Performance Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918.1 Description de Performance Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . 928.2 Installation de Performance Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . 928.3 Relevé et analyse des captures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

8.3.1 Investigation de performances au niveau serveur . . . . . . . . . . . 938.3.2 Investigation de performances au niveau table . . . . . . . . . . . . . 94

Chapitre 5Indexation

1. Qu'est-ce qu'un index ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

2. Présentation des types d'index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982.1 Index B-Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982.2 Index Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982.3 Index R-Tree . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002.4 Index Bitmap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1012.5 Index FullText. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

3. Stratégie de mise en œuvre d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1043.1 Impact des index sur l'environnement base de données. . . . . . . . . . . 104

3.1.1 Stockage des index sur disque . . . . . . . . . . . . . . . . . . . . . . . . . . 1043.1.2 Mode de stockage des index sur moteur MyISAM . . . . . . . . . 1043.1.3 Chargement des index en mémoire . . . . . . . . . . . . . . . . . . . . . 1043.1.4 Coût de mise à jour des données. . . . . . . . . . . . . . . . . . . . . . . . 106

3.2 Opérations sur les index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073.2.1 Création d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1073.2.2 Suppression d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

3.3 Justification de mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083.3.1 Principe de cardinalité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1083.3.2 Principe de sélectivité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

5Table des matières

4. Sélectivité d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094.1 Bonnes pratiques d'indexation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

4.1.1 Surveiller le Select_full_join . . . . . . . . . . . . . . . . . . . . . . . . . . . 1094.1.2 Définir les clauses d'indexation. . . . . . . . . . . . . . . . . . . . . . . . . 109

4.2 Justification d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

5. Utilisation d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.1 Plan d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1115.2 Forcer l'utilisation d'un index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125.3 Ignorer l'utilisation d'un index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125.4 Modifier l'ordre du parseur SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125.5 Coût de mise à jour des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6. Index et maintenance de table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146.1 Prise en compte des buffers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146.2 Reconstruction d'objet table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1146.3 Mise à jour des statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.3.1 Vérification de mise à jour des statistiques . . . . . . . . . . . . . . . 1156.3.2 Analyse des statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.4 Mise à jour d’un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

7. Optimisation d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177.1 Justification d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177.2 Mise à jour en différé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1177.3 Désactiver la mise à jour automatique des statistiques . . . . . . . . . . . 1177.4 Activer l'optimisation des index FullText . . . . . . . . . . . . . . . . . . . . . . 118

Chapitre 6Partitionnement

1. Qu'est-ce que le partitionnement ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1191.1 Quels sont les critères de mise en œuvre ? . . . . . . . . . . . . . . . . . . . . . 1191.2 Concept de partitionnement de données . . . . . . . . . . . . . . . . . . . . . . 1201.3 Augmenter les performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

2. Description du partitionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212.1 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212.2 Mécanisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

2.2.1 Caractéristiques techniques du partitionnement . . . . . . . . . . 1232.2.2 Gestion des données partitionnées sur disque . . . . . . . . . . . . . 124

6Performances et tuning

MySQL 5.6

3. Types de partitionnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

4. Création d'un partitionnement vertical . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

5. Création d'un partitionnement horizontal . . . . . . . . . . . . . . . . . . . . . . . . . 1265.1 Méthodologie de création de partition . . . . . . . . . . . . . . . . . . . . . . . . 1265.2 Création de type Hash partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1275.3 Création de type Key partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.4 Création de type Range partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.5 Création de type List partition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1305.6 Création de type Columns partition . . . . . . . . . . . . . . . . . . . . . . . . . . 1315.7 Création de type Linear partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

6. Sous-partitionnement des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133

7. Partitionnement avancé et moteur de stockage. . . . . . . . . . . . . . . . . . . . . . 1347.1 Prise en charge des moteurs de stockage . . . . . . . . . . . . . . . . . . . . . . . 1347.2 Partitionnement non applicable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

8. Manipulation des données partitionnées . . . . . . . . . . . . . . . . . . . . . . . . . . . 1358.1 Sélection de données dans une partition spécifique . . . . . . . . . . . . . . 1358.2 Mécanisme de pruning partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

9. Monitorer le partitionnement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1379.1 Informations sur le partitionnement. . . . . . . . . . . . . . . . . . . . . . . . . . 137

9.1.1 Méthode Show Create Table . . . . . . . . . . . . . . . . . . . . . . . . . . 1389.1.2 Méthode Show Table Status. . . . . . . . . . . . . . . . . . . . . . . . . . . 1389.1.3 Méthode Information_Schema Partition . . . . . . . . . . . . . . . . . 1399.1.4 Méthode Explain Partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

9.2 Surveiller la répartition des données . . . . . . . . . . . . . . . . . . . . . . . . . . 140

10. Maintenance des tables partitionnées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14110.1 Activer le partitionnement de données . . . . . . . . . . . . . . . . . . . . . . . . 141

10.1.1 Activer le partitionnement au niveau de l'instance . . . . . . . . . 14110.1.2 Activer le partitionnement au niveau de la table. . . . . . . . . . . 141

10.2 Maintenance des partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14210.2.1 Ajout de partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14210.2.2 Réorganisation de partition. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14210.2.3 Reconstruction de partition . . . . . . . . . . . . . . . . . . . . . . . . . . . 14210.2.4 Division (split) de partition. . . . . . . . . . . . . . . . . . . . . . . . . . . . 14310.2.5 Fusion (merge) de partitions . . . . . . . . . . . . . . . . . . . . . . . . . . . 14310.2.6 Libération (coalesce) de partition . . . . . . . . . . . . . . . . . . . . . . . 144

7Table des matières

10.2.7 Suppression de partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14410.3 Supprimer le partitionnement des données . . . . . . . . . . . . . . . . . . . . 14510.4 Impact de performance des opérations de partition. . . . . . . . . . . . . . 145

Chapitre 7Tuning des requêtes

1. Qu'est-ce qu'une requête lente ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

2. Premiers pas dans l'optimisation SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1482.1 Collecter les requêtes de l'instance . . . . . . . . . . . . . . . . . . . . . . . . . . . 1482.2 Analyse des requêtes journalisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

2.2.1 Utilitaire d'analyse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1502.2.2 Analyse des requêtes collectées. . . . . . . . . . . . . . . . . . . . . . . . . 151

3. Contrôle des points d'optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1523.1 Contrôler les paramètres clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1523.2 Cacher les index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1543.3 Cacher les résultats des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1553.4 Surveiller la consommation mémoire . . . . . . . . . . . . . . . . . . . . . . . . . 1563.5 Optimiser le modèle de requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

4. Plan d'optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1584.1 MySQL Query Optimizer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1584.2 Transformation des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

5. Exécution des requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1595.1 Valoriser le coût des requêtes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1595.2 Contrôler les optimisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1605.3 Paramètres système d'amélioration des requêtes . . . . . . . . . . . . . . . . 161

5.3.1 Déterminer la valeur optimale du read_buffer_size . . . . . . . . 1615.3.2 Déterminer la valeur optimale du sort_buffer_size. . . . . . . . . 162

5.4 Paramètres hints d'amélioration des requêtes. . . . . . . . . . . . . . . . . . . 164

6. Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1646.1 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1646.2 Échantillon des statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

6.2.1 Mode de fonctionnement transitoire . . . . . . . . . . . . . . . . . . . . 1656.2.2 Mode de fonctionnement d'échantillonnage . . . . . . . . . . . . . . 1666.2.3 Mode de fonctionnement persistant . . . . . . . . . . . . . . . . . . . . 167

8Performances et tuning

MySQL 5.6

6.3 Mise à jour des statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1686.4 Suivi des statistiques. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

7. Analyse du plan d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1697.1 Optimisation des requêtes avec EXPLAIN . . . . . . . . . . . . . . . . . . . . . 1707.2 Commande EXPLAIN au format traditionnel . . . . . . . . . . . . . . . . . . 1707.3 Commande EXPLAIN au format JSON. . . . . . . . . . . . . . . . . . . . . . . . 172

8. Sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1738.1 Description des sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

8.1.1 Présentation des stratégies d'optimisation . . . . . . . . . . . . . . . . 1738.1.2 Optimisation traditionnelle . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

8.2 Amélioration des sous-requêtes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1748.3 Paramètres d'optimisation des sous-requêtes . . . . . . . . . . . . . . . . . . . 175

Chapitre 8MySQL Cache et cache système

1. Qu'est-ce que le cache et le Query Cache ? . . . . . . . . . . . . . . . . . . . . . . . . . 1771.1 Le cache des données système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1771.2 Les caches des données MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1781.3 Le cache des requêtes MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

1.3.1 Mécanisme de fonctionnement. . . . . . . . . . . . . . . . . . . . . . . . . 1781.3.2 Gestion des données dans le Query Cache. . . . . . . . . . . . . . . . 180

2. Configuration du Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1812.1 Le Query Cache est-il toujours nécessaire ? . . . . . . . . . . . . . . . . . . . . 1812.2 Liste des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

2.2.1 Initialisation des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . 1812.2.2 Paramètre QUERY_CACHE_TYPE . . . . . . . . . . . . . . . . . . . . . 1822.2.3 Paramètre QUERY_CACHE_SIZE . . . . . . . . . . . . . . . . . . . . . . 1832.2.4 Paramètre QUERY_CACHE_LIMIT . . . . . . . . . . . . . . . . . . . . 1832.2.5 Paramètre QUERY_CACHE_MIN_RES_UNIT . . . . . . . . . . . 1842.2.6 Paramètre QUERY_CACHE_ALLOC_BLOCK_SIZE . . . . . . . 1842.2.7 Paramètre QUERY_PREALLOC_SIZE . . . . . . . . . . . . . . . . . . . 184

3. Gestion et maintenance du Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . 1843.1 Activer le Query Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1843.2 Désactiver le Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1853.3 Vider le Query Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

9Table des matières

3.4 Surveiller le Query Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1863.4.1 Surveiller le statut des variables du Query Cache . . . . . . . . . . 1863.4.2 Surveiller les performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

4. Variables avancées du Query Cache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.1 Variable Qcache_free_blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.2 Variable Qcache_free_memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.3 Variable Qcache_hits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.4 Variable Qcache_inserts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.5 Variable Qcache_lowmem_prunes . . . . . . . . . . . . . . . . . . . . . . . . . . . 1884.6 Variable Qcache_not_cached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1894.7 Variable Qcache_queries_in_cache . . . . . . . . . . . . . . . . . . . . . . . . . . . 1894.8 Variable Qcache_total_blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

5. Optimiseur et cache des données (SQL_CACHE). . . . . . . . . . . . . . . . . . . . 189

6. Prise en compte des limitations du Query Cache . . . . . . . . . . . . . . . . . . . . 190

7. Monitorer la performance du Query Cache. . . . . . . . . . . . . . . . . . . . . . . . . 1917.1 Déterminer le taux de remplissage du Query Cache . . . . . . . . . . . . . 1917.2 Déterminer le taux de fragmentation du Query Cache . . . . . . . . . . . 1917.3 Déterminer le pourcentage de requêtes en cache . . . . . . . . . . . . . . . . 1927.4 Déterminer le pourcentage de rotation du Query Cache. . . . . . . . . . 1927.5 Déterminer le pourcentage d'efficacité du Query Cache . . . . . . . . . . 193

Chapitre 9Configuration de MySQL Server

1. Configuration du serveur MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1951.1 Initialisation des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1951.2 Démarrage de l'instance MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1971.3 Prise en compte d'un chargement initial . . . . . . . . . . . . . . . . . . . . . . . 198

2. Configuration des paramètres de connexion . . . . . . . . . . . . . . . . . . . . . . . . 1982.1 Description du mode de connectivité . . . . . . . . . . . . . . . . . . . . . . . . . 1982.2 Jeton de connectivité client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2002.3 Processus d’arrière-plan : Listener . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2002.4 Paramètres avancés de connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

2.4.1 Paramètre MAX_CONNECTIONS . . . . . . . . . . . . . . . . . . . . . 2012.4.2 Paramètre MAX_USER_CONNECTIONS . . . . . . . . . . . . . . . 202

10Performances et tuning

MySQL 5.6

2.4.3 Paramètre MAX_CONNECT_ERRORS . . . . . . . . . . . . . . . . . 2022.4.4 Paramètre SKIP_NAME_RESOLVE . . . . . . . . . . . . . . . . . . . . . 2032.4.5 Paramètre MAX_ALLOWED_PACKET . . . . . . . . . . . . . . . . . . 2042.4.6 Paramètre SKIP_NETWORKING . . . . . . . . . . . . . . . . . . . . . . . 204

2.5 Surveiller les sessions de connectivité . . . . . . . . . . . . . . . . . . . . . . . . . 2052.6 Surveiller les erreurs de connexion. . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

3. Configuration de l'utilisation mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2063.1 Mémoire réservée pour le système d’exploitation . . . . . . . . . . . . . . . 2063.2 Mémoire nécessaire pour MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2073.3 Cache des moteurs de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

3.3.1 Cache des données MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . 2093.3.2 Cache des données InnoDB. . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

3.4 Mémoire nécessaire par connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . 2113.4.1 Description technique des buffers de sessions . . . . . . . . . . . . . 2113.4.2 Calcul des buffers de sessions . . . . . . . . . . . . . . . . . . . . . . . . . . 213

3.5 Allocation mémoire temporaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2133.5.1 Mode de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2133.5.2 Caractéristiques techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . 2153.5.3 Calcul de l'efficacité du cache temporaire . . . . . . . . . . . . . . . . 216

4. Gestion des I/O Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2174.1 Prise en compte I/O de l'environnement. . . . . . . . . . . . . . . . . . . . . . . 217

4.1.1 Analyse des schémas de données MySQL . . . . . . . . . . . . . . . . 2174.1.2 Paramètre OPEN_FILES_LIMIT . . . . . . . . . . . . . . . . . . . . . . . . 2184.1.3 Vérifier la configuration de la description I/O

Files utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2194.2 Paramètres du cache des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

4.2.1 Paramètre TABLE_OPEN_CACHE. . . . . . . . . . . . . . . . . . . . . . 2194.2.2 Paramètre DEFINITION_TABLE_CACHE . . . . . . . . . . . . . . . 2194.2.3 Déterminer l’efficacité du cache des tables . . . . . . . . . . . . . . . 220

4.3 Paramètres avancés sur les fichiers de structure InnoDB . . . . . . . . . . 222

5. Configuration de la concurrence d'accès aux données. . . . . . . . . . . . . . . . . 2225.1 Concurrence d'accès sur moteur MyISAM . . . . . . . . . . . . . . . . . . . . . 2225.2 Concurrence d'accès sur moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . 224

6. Gestion des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2256.1 Les transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2256.2 Niveaux d'isolation des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . 226

11Table des matières

6.3 Phénomène de deadlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2276.4 Journalisation des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2286.5 Fonctionnement des transactions dans MySQL. . . . . . . . . . . . . . . . . 228

6.5.1 Paramètre AUTOCOMMIT . . . . . . . . . . . . . . . . . . . . . . . . . . . 2286.5.2 Paramètre ISOLATION_LEVEL . . . . . . . . . . . . . . . . . . . . . . . . 2296.5.3 Verrouillage implicite et explicite . . . . . . . . . . . . . . . . . . . . . . . 229

7. Nouveautés MySQL 5.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

Chapitre 10Caractéristiques avancées des objets MySQL

1. Les objets pris en charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

2. Les utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.1 Description des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.2 Création des utilisateurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.3 Fonctionnalités avancées de connectivité et d’utilisation . . . . . . . . . 234

2.3.1 Gestion de la sécurité. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2342.3.2 Paramétrages avancés d’utilisation. . . . . . . . . . . . . . . . . . . . . . 235

3. Les tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2363.1 Stockage d’une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2363.2 Création avancée d’une table compressée . . . . . . . . . . . . . . . . . . . . . . 2363.3 Prise en compte des clés étrangères . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

4. Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2394.1 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2394.2 Création de vue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2394.3 Création avancée d’une vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2404.4 Suppression de vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

5. Requêtes préparées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2415.1 Pourquoi utiliser des requêtes préparées ?. . . . . . . . . . . . . . . . . . . . . . 2415.2 Création d’une requête préparée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2415.3 Exécuter une requête préparée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2415.4 Libérer une requête préparée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

6. Procédures stockées et fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2426.1 Pourquoi utiliser des procédures stockées ? . . . . . . . . . . . . . . . . . . . . 2426.2 Création d’une procédure stockée . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

12Performances et tuning

MySQL 5.6

6.3 Création d’une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2446.4 Gestion des paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2446.5 Exécuter une procédure stockée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2446.6 Supprimer une procédure stockée . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

7. Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2457.1 Pourquoi utiliser un trigger ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2457.2 Création d’un trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2457.3 Gestion d’événement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2467.4 Supprimer un trigger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2467.5 Prise en compte des limitations d’un trigger . . . . . . . . . . . . . . . . . . . . 247

8. Recherche fullText. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2478.1 Présentation du fullText. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2478.2 Création de colonne fullText . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2488.3 Création d’index sur colonne fullText. . . . . . . . . . . . . . . . . . . . . . . . . 2488.4 Sélectionner des données fullText . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

9. Obtenir les métadonnées des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2499.1 Métadonnées des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2499.2 Métadonnées des procédures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2499.3 Métadonnées des triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2499.4 Métadonnées des vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

Chapitre 11Gestion d'un moteur de stockage

1. Définition d’un moteur de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

2. Liste des moteurs de stockage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2522.1 Principaux moteurs sous MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2522.2 Liste des moteurs de stockage disponibles. . . . . . . . . . . . . . . . . . . . . . 2522.3 Moteurs de stockage disponibles en version 5.6 . . . . . . . . . . . . . . . . . 255

3. Moteur de stockage MyISAM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2553.1 Description du moteur MyISAM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

3.1.1 Historique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2553.1.2 Caractéristiques techniques et fonctionnalités . . . . . . . . . . . . 255

13Table des matières

3.2 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2573.2.1 Mécanisme de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . 2573.2.2 Gestion des données en mémoire . . . . . . . . . . . . . . . . . . . . . . . 2603.2.3 Gestion des données sur disques. . . . . . . . . . . . . . . . . . . . . . . . 262

3.3 Gestion des buffers MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2633.3.1 Paramètre KEY_BUFFER_SIZE. . . . . . . . . . . . . . . . . . . . . . . . . 2633.3.2 Déterminer la taille optimale du Key buffer . . . . . . . . . . . . . . 2643.3.3 Déterminer le pourcentage d'occupation du Key buffer . . . . . 2643.3.4 Déterminer de multiples Key Cache. . . . . . . . . . . . . . . . . . . . . 2653.3.5 Surveiller le buffer MyISAM. . . . . . . . . . . . . . . . . . . . . . . . . . . 2663.3.6 Surveiller la performance du buffer MyISAM . . . . . . . . . . . . . 267

3.4 Gestion des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2673.4.1 Création d'une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2673.4.2 Déterminer la taille d'une table. . . . . . . . . . . . . . . . . . . . . . . . . 2693.4.3 Maintenance et optimisation d'une table . . . . . . . . . . . . . . . . 2703.4.4 Compactage d'une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2723.4.5 Informations détaillées d'une table. . . . . . . . . . . . . . . . . . . . . . 274

3.5 Paramétrages avancés MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2753.5.1 Optimisation de la concurrence d'accès aux données . . . . . . . 2753.5.2 Paramètre BULK_INSERT_BUFFER_SIZE . . . . . . . . . . . . . . . 2753.5.3 Paramètre MYISAM_SORT_BUFFER_SIZE . . . . . . . . . . . . . . 2763.5.4 Paramètre MYISAM_STATS_METHOD . . . . . . . . . . . . . . . . 2763.5.5 Paramètre MYISAM-BLOCK-SIZE . . . . . . . . . . . . . . . . . . . . . 2773.5.6 Paramètre KEY_CACHE_BLOCK_SIZE . . . . . . . . . . . . . . . . . 2773.5.7 Paramètre TMP_TABLE_SIZE . . . . . . . . . . . . . . . . . . . . . . . . . 278

4. Moteur de stockage Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2784.1 Description du moteur Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

4.1.1 Présentation de Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2784.1.2 Caractéristiques techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . 2794.1.3 Principe d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

4.2 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2804.2.1 Mécanisme de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . 2804.2.2 Gestion des données en mémoire . . . . . . . . . . . . . . . . . . . . . . . 2814.2.3 Gestion des données sur disque . . . . . . . . . . . . . . . . . . . . . . . . 282

4.3 Gestion des buffers Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2824.3.1 Paramètre MAX_HEAP_TABLE_SIZE . . . . . . . . . . . . . . . . . . . 2824.3.2 Surveiller le buffer Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

14Performances et tuning

MySQL 5.6

4.4 Gestion des tables et index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2834.4.1 Création d'une table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2834.4.2 Déterminer la taille d'une table . . . . . . . . . . . . . . . . . . . . . . . . . 2844.4.3 Maintenance et optimisation d'une table. . . . . . . . . . . . . . . . . 2854.4.4 Persistance des données Memory sur disque . . . . . . . . . . . . . . 2854.4.5 Informations détaillées d'une table mémoire . . . . . . . . . . . . . . 2864.4.6 Utilisation d'un index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

5. Utilisation des moteurs de stockage secondaires . . . . . . . . . . . . . . . . . . . . . 2875.1 Moteur de stockage Archive. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

5.1.1 Présentation du moteur Archive . . . . . . . . . . . . . . . . . . . . . . . . 2875.1.2 Création d'une table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2875.1.3 Maintenance de la table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2885.1.4 Limites techniques du moteur. . . . . . . . . . . . . . . . . . . . . . . . . . 288

5.2 Moteur de stockage CSV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2885.2.1 Présentation du moteur CSV . . . . . . . . . . . . . . . . . . . . . . . . . . 2885.2.2 Création d'une table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2895.2.3 Limites techniques du moteur. . . . . . . . . . . . . . . . . . . . . . . . . . 289

5.3 Moteur de stockage Federated . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2895.3.1 Présentation du moteur Federated . . . . . . . . . . . . . . . . . . . . . . 2895.3.2 Création d'une table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2905.3.3 Gestion des données. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2905.3.4 Limites techniques du moteur. . . . . . . . . . . . . . . . . . . . . . . . . . 291

6. Besoin d'un moteur transactionnel ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291

7. Comparatif des moteurs de stockage MyISAM vs InnoDB . . . . . . . . . . . . 2927.1 Comparatif des fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2927.2 Comparatif des performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

8. Quel avenir pour MyISAM ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Chapitre 12Moteur de stockage InnoDB

1. Description et utilisation du moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . . 3011.1 Description du moteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

1.1.1 Historique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3011.1.2 Versions du moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . 3021.1.3 Caractéristiques techniques du moteur . . . . . . . . . . . . . . . . . . 302

15Table des matières

1.2 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3031.2.1 Mécanisme de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . 3031.2.2 Gestion des données en mémoire . . . . . . . . . . . . . . . . . . . . . . . 3081.2.3 Gestion des données sur disque . . . . . . . . . . . . . . . . . . . . . . . . 309

2. Configuration du moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3102.1 Initialisation des paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3102.2 Paramètre DEFAULT_STORAGE_ENGINE. . . . . . . . . . . . . . . . . . . . 3112.3 Paramètre INNODB_FILE_PER_TABLE . . . . . . . . . . . . . . . . . . . . . . . 3122.4 Paramètre INNODB_FILE_FORMAT. . . . . . . . . . . . . . . . . . . . . . . . . 3122.5 Paramètre INNODB_STRICT_MODE . . . . . . . . . . . . . . . . . . . . . . . . 314

3. Prise en compte du plug-in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3153.1 Installation du plug-in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3153.2 Vérification du plug-in InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318

4. Gestion des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3184.1 Création d'une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3184.2 Maintenance et optimisation d'une table . . . . . . . . . . . . . . . . . . . . . . 3194.3 Compactage d'une table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320

5. Gestion des buffers InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3205.1 Paramètre INNODB_BUFFER_POOL_SIZE. . . . . . . . . . . . . . . . . . . . 3205.2 Paramètre INNODB_ADDITIONAL_MEM_POOL_SIZE . . . . . . . . 3215.3 Paramètre INNODB_BUFFER_POOL_AWE_MEM_MB . . . . . . . . . 3225.4 Déterminer l'efficacité du Buffer Pool . . . . . . . . . . . . . . . . . . . . . . . . . 3235.5 Déterminer le pourcentage de pages libres . . . . . . . . . . . . . . . . . . . . . 323

6. Gestion des journaux InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3246.1 Fonctionnement de la journalisation . . . . . . . . . . . . . . . . . . . . . . . . . 3246.2 Déterminer la taille optimale des journaux . . . . . . . . . . . . . . . . . . . . 3256.3 Déterminer le pourcentage d'occupation des fichiers Log Files . . . . . 3266.4 Surveiller les Redo logs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3276.5 Paramètres InnoDB Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

6.5.1 Paramètre INNODB_LOG_GROUP_HOME_DIR . . . . . . . . . 3286.5.2 Paramètre INNODB_LOG_BUFFER_SIZE . . . . . . . . . . . . . . . 3296.5.3 Paramètre INNODB_LOG_FILE_SIZE. . . . . . . . . . . . . . . . . . . 3306.5.4 Paramètre INNODB_FLUSH_LOG_AT_TRX_COMMIT. . . 3326.5.5 Paramètre INNODB_LOG_FILES_IN_GROUP. . . . . . . . . . . . 333

16Performances et tuning

MySQL 5.6

7. Gestion des segments d'annulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3347.1 Le tablespace d'UNDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3347.2 Paramètre INNODB_DATA_FILE_PATH . . . . . . . . . . . . . . . . . . . . . 3347.3 Paramètre INNODB_UNDO_DIRECTORY . . . . . . . . . . . . . . . . . . . 3357.4 Paramètre INNODB_UNDO_LOGS . . . . . . . . . . . . . . . . . . . . . . . . . . 3367.5 Paramètre INNODB_UNDO_TABLESPACES . . . . . . . . . . . . . . . . . . 3367.6 Surveiller les segments d'annulation . . . . . . . . . . . . . . . . . . . . . . . . . . 337

8. Paramétrages avancés InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3378.1 Paramètre INNODB_BUFFER_POOL_INSTANCES . . . . . . . . . . . . . 3378.2 Paramètre INNODB_CHANGE_BUFFER_MAX_SIZE . . . . . . . . . . . 3398.3 Paramètre INNODB_IO_CAPACITY . . . . . . . . . . . . . . . . . . . . . . . . . 3398.4 Paramètre INNODB_CHECKSUM_ALGORITHM. . . . . . . . . . . . . . 3408.5 Paramètre INNODB_DOUBLEWRITE . . . . . . . . . . . . . . . . . . . . . . . . 3418.6 Paramètre INNODB_FLUSH_METHOD . . . . . . . . . . . . . . . . . . . . . . 3428.7 Paramètre INNODB_USE_NATIVE_AIO . . . . . . . . . . . . . . . . . . . . . 3438.8 Paramètre INNODB_XA_SUPPORTS. . . . . . . . . . . . . . . . . . . . . . . . . 3438.9 Paramètre INNODB_THREAD_CONCURRENCY . . . . . . . . . . . . . 3448.10 Paramètre INNODB_PURGE_THREADS. . . . . . . . . . . . . . . . . . . . . . 3458.11 Paramètre INNODB_READ_IO_THREADS . . . . . . . . . . . . . . . . . . . 3468.12 Paramètre INNODB_WRITE_IO_THREADS . . . . . . . . . . . . . . . . . . 3468.13 Paramètre INNODB_MAX_DIRTY_PAGES_PCT. . . . . . . . . . . . . . . 3478.14 Paramètre INNODB_OPEN_FILES . . . . . . . . . . . . . . . . . . . . . . . . . . . 347

9. Surveillance du moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3489.1 Information InnoDB STATUS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3489.2 Informations sur les InnoDB MUTEX . . . . . . . . . . . . . . . . . . . . . . . . 3519.3 Surveillance de la journalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352

10. Nouveautés MySQL 5.6 du moteur InnoDB . . . . . . . . . . . . . . . . . . . . . . . . 354

11. Nouveautés MySQL 5.7 du moteur InnoDB attendues . . . . . . . . . . . . . . . 354

17Table des matières

Chapitre 13Prise en compte de l'environnement

1. Quelle architecture système ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

2. Prise en considération de l'environnement hôte . . . . . . . . . . . . . . . . . . . . . 356

3. Prise en compte du stockage (SAN, NAS, SSD, HDISK...) . . . . . . . . . . . . . 3573.1 Présentation des systèmes de stockage . . . . . . . . . . . . . . . . . . . . . . . . 357

3.1.1 Le SAN (Storage Area Network). . . . . . . . . . . . . . . . . . . . . . . . 3573.1.2 Le NAS (Network-Attached Storage). . . . . . . . . . . . . . . . . . . . 3573.1.3 Le SSD (Solid-State Drive) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

3.2 Description des types de RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359

4. Prise en compte des processeurs (cores) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3604.1 Présentation des processeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3604.2 Architecture Threading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3614.3 Architecture SMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3624.4 Architecture NUMA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363

5. Prise en compte de la mémoire (RAM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3665.1 Mémoire haute (RAM). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3665.2 Mémoire basse (SWAP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3675.3 Mémoire disque (RAMDISK/RAMFS) . . . . . . . . . . . . . . . . . . . . . . . . 3695.4 Mémoire verrouillée (MEMLOCK) . . . . . . . . . . . . . . . . . . . . . . . . . . . 370

6. Configuration et optimisation du système d'exploitation . . . . . . . . . . . . . 371

7. Configuration de la couche réseau (Network). . . . . . . . . . . . . . . . . . . . . . . 372

8. Performances du partitionnement système (filesystem) . . . . . . . . . . . . . . 3748.1 Présentation des systèmes de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . 3748.2 Caractéristiques techniques des systèmes de fichiers. . . . . . . . . . . . . 3748.3 Configuration des systèmes de fichiers . . . . . . . . . . . . . . . . . . . . . . . . 3758.4 Performances des systèmes de fichiers . . . . . . . . . . . . . . . . . . . . . . . . 377

9. Sauvegarde et restauration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3789.1 Sauvegarde MYSQLDUMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3789.2 Restauration MYSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379

18Performances et tuning

MySQL 5.6

10. MySQL Enterprise Backup (MEB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38010.1 Présentation de MEB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38010.2 Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38010.3 Sauvegarde en ligne. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

10.3.1 Sauvegarde complète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38110.3.2 Sauvegarde incrémentielle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

10.4 Restauration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383

Chapitre 14Haute performance MySQL (réplication)

1. Description de la réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3851.1 Présentation de la réplication des données . . . . . . . . . . . . . . . . . . . . . 385

1.1.1 Qu'est-ce qu'une réplication de données ? . . . . . . . . . . . . . . . . 3851.1.2 Dans quels cas utiliser la réplication ? . . . . . . . . . . . . . . . . . . . 386

1.2 Fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3871.2.1 Mécanisme de fonctionnement. . . . . . . . . . . . . . . . . . . . . . . . . 3871.2.2 Gestion des données en mémoire . . . . . . . . . . . . . . . . . . . . . . . 3891.2.3 Gestion des données sur disques . . . . . . . . . . . . . . . . . . . . . . . . 390

2. Conception d'architecture répliquée. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3912.1 Prise en compte de l'environnement . . . . . . . . . . . . . . . . . . . . . . . . . . 3912.2 Architecture de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3912.3 Concept de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

2.3.1 Réplication maître/esclave . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3942.3.2 Réplication maître/maître . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

3. Mise en œuvre d'une réplication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

4. Configuration de la fonctionnalité MySQL Replication. . . . . . . . . . . . . . . 3954.1 Préparation des environnements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3954.2 Configuration MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

4.2.1 Préparation de l'environnement maître . . . . . . . . . . . . . . . . . . 3964.2.2 Préparation de l'environnement esclave . . . . . . . . . . . . . . . . . . 396

4.3 Synchronisation des données à répliquer . . . . . . . . . . . . . . . . . . . . . . 3974.3.1 Relevé de position de l'environnement maître . . . . . . . . . . . . . 3974.3.2 Sauvegarde des données de l'environnement maître . . . . . . . . 3974.3.3 Restauration des données de l'environnement esclave . . . . . . 3984.3.4 Positionner l'environnement esclave. . . . . . . . . . . . . . . . . . . . . 398

19Table des matières

4.4 Démarrer la réplication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3994.5 Suivi des événements de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . 399

5. Paramétrages avancés de MySQL Replication. . . . . . . . . . . . . . . . . . . . . . . 4015.1 Gestion des paramètres de réplication. . . . . . . . . . . . . . . . . . . . . . . . . 401

5.1.1 Paramètre SERVER-ID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4015.1.2 Paramètre AUTO_INCREMENT_INCREMENT . . . . . . . . . . 4015.1.3 Paramètre AUTO_INCREMENT_OFFSET. . . . . . . . . . . . . . . 4025.1.4 Paramètre EXPIRE_LOG_DAYS. . . . . . . . . . . . . . . . . . . . . . . . 4035.1.5 Paramètre SLAVE_NET_TIMEOUT . . . . . . . . . . . . . . . . . . . . 403

5.2 Gestion des paramètres des binlogs . . . . . . . . . . . . . . . . . . . . . . . . . . . 4045.2.1 Paramètre SYNC_BINLOG. . . . . . . . . . . . . . . . . . . . . . . . . . . . 4045.2.2 Paramètre BINLOG_CACHE_SIZE . . . . . . . . . . . . . . . . . . . . . 4045.2.3 Paramètre BINLOG_FORMAT. . . . . . . . . . . . . . . . . . . . . . . . . 4055.2.4 Paramètre BINLOG-IGNORE-DB . . . . . . . . . . . . . . . . . . . . . . 406

5.3 Gestion des paramètres des relaylogs . . . . . . . . . . . . . . . . . . . . . . . . . 4065.3.1 Paramètre REPLICATE-IGNORE-DB. . . . . . . . . . . . . . . . . . . . 4065.3.2 Paramètre REPLICATE-DO-DB . . . . . . . . . . . . . . . . . . . . . . . . 406

5.4 Optimisation des paramètres de réplication . . . . . . . . . . . . . . . . . . . . 4075.4.1 Présentation des points de contrôle de réplication . . . . . . . . . 4075.4.2 Paramètre BINLOG_CHECKSUM . . . . . . . . . . . . . . . . . . . . . . 4085.4.3 Paramètre MASTER_VERIFY_CHECKSUM . . . . . . . . . . . . . 4085.4.4 Paramètre SLAVE_SQL_VERIFY_CHECKSUM . . . . . . . . . . . 409

5.5 Amélioration de la réplication en mode ROW . . . . . . . . . . . . . . . . . . 4095.6 Gestion du parallélisme de réplication . . . . . . . . . . . . . . . . . . . . . . . . 412

5.6.1 Augmenter la capacité avec la réplication multithread. . . . . . 4125.6.2 Paramètre SLAVE_PARALLEL_WORKERS . . . . . . . . . . . . . . . 412

6. Surveiller les serveurs de réplication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4136.1 Monitorer l'environnement maître . . . . . . . . . . . . . . . . . . . . . . . . . . . 413

6.1.1 Information du statut Master . . . . . . . . . . . . . . . . . . . . . . . . . 4136.1.2 Surveiller les sessions de réplication . . . . . . . . . . . . . . . . . . . . . 413

6.2 Monitorer l'environnement esclave . . . . . . . . . . . . . . . . . . . . . . . . . . . 4146.2.1 Information du statut Slave . . . . . . . . . . . . . . . . . . . . . . . . . . . 4146.2.2 Surveiller les threads esclaves . . . . . . . . . . . . . . . . . . . . . . . . . . 4166.2.3 Surveiller le parallélisme du travail. . . . . . . . . . . . . . . . . . . . . . 417

6.3 Informations basiques de réplication esclave . . . . . . . . . . . . . . . . . . . 4186.3.1 Information de la réplication en provenance du maître . . . . . 4186.3.2 Information de la réplication mise à jour esclave . . . . . . . . . . 418

20Performances et tuning

MySQL 5.6

6.4 Thread de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4196.4.1 Le Binlog Dump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4196.4.2 Le Slave_IO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4196.4.3 Le Slave_SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4206.4.4 Démarrer ou arrêter les threads de réplication. . . . . . . . . . . . . 420

6.5 Monitorer le retard de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4216.6 Surveiller le cache des binlogs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422

6.6.1 Calculer l'efficacité du Binlog cache . . . . . . . . . . . . . . . . . . . . . 4226.6.2 Visualisation des fichiers Binlog cache sur disque . . . . . . . . . . 422

7. Identifier les problèmes de réplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

8. Nouveautés sur MySQL 5.6 Replication . . . . . . . . . . . . . . . . . . . . . . . . . . . 4248.1 Mode de parallélisme de réplication des données . . . . . . . . . . . . . . . . 4248.2 Contrôle de cohérence des données répliquées . . . . . . . . . . . . . . . . . . 424

9. Nouveautés attendues MySQL 5.7 Replication. . . . . . . . . . . . . . . . . . . . . . 424

Chapitre 15Haute disponibilité MySQL (cluster)

1. Qu'est-ce que la haute disponibilité ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425

2. Choisir la solution de haute disponibilité. . . . . . . . . . . . . . . . . . . . . . . . . . . 4282.1 Solution de réplication de données . . . . . . . . . . . . . . . . . . . . . . . . . . . 4282.2 Solutions de répartition de charge . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428

2.2.1 Solution de répartition de charge système . . . . . . . . . . . . . . . . 4292.2.2 Solution de répartition de charge MySQL Proxy . . . . . . . . . . . 430

2.3 Solutions de virtualisation des environnements. . . . . . . . . . . . . . . . . 4302.4 Solutions de synchronisation des partitions . . . . . . . . . . . . . . . . . . . . 430

3. Concept de cluster système (Linux/Windows) . . . . . . . . . . . . . . . . . . . . . . 4323.1 Présentation de la solution cluster système . . . . . . . . . . . . . . . . . . . . 432

3.1.1 Groupe de services et applications . . . . . . . . . . . . . . . . . . . . . . 4323.1.2 Ressources MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432

3.2 Introduction à Windows Server R2 Failover Clustering . . . . . . . . . . 4323.3 Introduction aux solutions cluster Linux . . . . . . . . . . . . . . . . . . . . . . 435

3.3.1 Cluster Linux Pacemaker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4353.3.2 Cluster Linux Heartbeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435

21Table des matières

4. Le premier cluster data : MySQL DRBD . . . . . . . . . . . . . . . . . . . . . . . . . . . 4364.1 Présentation de DRBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4364.2 Premier cluster MySQL DRBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

5. Introduction à MySQL Cluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4405.1 Présentation de l'architecture MySQL Cluster . . . . . . . . . . . . . . . . . . 440

5.1.1 Mode de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4405.1.2 Présentation des process Mycluster . . . . . . . . . . . . . . . . . . . . . 4435.1.3 Topologie d'architecture Mycluster . . . . . . . . . . . . . . . . . . . . . 444

5.2 Gestion de nœuds Mycluster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4455.2.1 Nœud de management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4455.2.2 Nœud de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4455.2.3 Nœud d'exécution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446

5.3 Gestion du cluster MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4465.4 Optimisation de l'environnement Mycluster . . . . . . . . . . . . . . . . . . . 449

5.4.1 Configuration avancée du Kernel Linux . . . . . . . . . . . . . . . . . 4495.4.2 Configuration avancée du nœud de données. . . . . . . . . . . . . . 4505.4.3 Configuration avancée du nœud d'exécution SQL . . . . . . . . . 450

6. Nouveautés MySQL Cluster 7.3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4516.1 Gestion des Foreign Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4516.2 Fonction d'auto_installeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4526.3 Fonctionnalité NoSQL avec JavaScript . . . . . . . . . . . . . . . . . . . . . . . . 4546.4 Intégration native de MySQL Server 5.6. . . . . . . . . . . . . . . . . . . . . . . 4556.5 Consolidation des sauvegardes et restauration. . . . . . . . . . . . . . . . . . 455

7. Nouveautés MySQL Cluster 7.4 attendues . . . . . . . . . . . . . . . . . . . . . . . . . 456

Chapitre 16MySQL et le Big Data

1. MySQL pour le Big Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4571.1 Les applications dans des plateformes MySQL Big Data . . . . . . . . . . 457

1.1.1 Présentation du Big Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4571.1.2 Mécanismes d'intégration MySQL Big Data . . . . . . . . . . . . . . 458

1.2 Les composants d'architecture MySQL Big Data . . . . . . . . . . . . . . . . 460

2. MySQL dans le Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4622.1 Présentation du Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4622.2 Les quatre principales ressources et fondements du Cloud . . . . . . . . 463

22Performances et tuning

MySQL 5.6

2.3 Une solution hautement disponible et évolutive . . . . . . . . . . . . . . . . 464

3. MySQL pour le SaaS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4653.1 Définition du SaaS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4653.2 Architecture SaaS vs Hosting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4653.3 Avantages du SaaS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4663.4 Haute disponibilité et protection des données . . . . . . . . . . . . . . . . . . 466

4. MySQL et NoSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4674.1 Présentation du NoSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4674.2 De nouvelles technologies pour de nouvelles demandes… . . . . . . . . 4684.3 Utilisation de NoSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469

4.3.1 Relation Key-value avec MySQL Memcached . . . . . . . . . . . . . 4694.3.2 Relation Key-value avec MySQL . . . . . . . . . . . . . . . . . . . . . . . 4694.3.3 Implémentation de Memcached dans MySQL 5.6 . . . . . . . . . 4694.3.4 Installation de Memcached dans InnoDB . . . . . . . . . . . . . . . . 470

4.4 Performances de NoSQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

5. MySQL et Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4715.1 Présentation de Memcached. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4715.2 Architecture Memcached . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

5.2.1 Memcached Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4715.2.2 Memcached Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472

5.3 Niveaux d’architecture MySQL Memcached . . . . . . . . . . . . . . . . . . . 473

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475

147

Chapitre 7

Tuning des requêtes

Tuning des requêtes1. Qu'est-ce qu'une requête lente ?

Lorsqu'il y a des remontées d'utilisateurs ou une constatation de comportement lentau niveau de l'application, améliorer les requêtes les plus problématiques s'avère géné-ralement payant.Les utilisateurs auront un ressenti de gain d'exécution, le niveau d'activité du serveursera quant à lui moins important et enfin il sera plus disponible en ressource, pour per-mettre une charge d’exécution plus importante.Chacun possède sa propre perception des lenteurs... Un traitement qui dure une heure ne signifie pas pour autant une lenteur d'exécution.Ce qui est important, c'est la comparaison entre l'avant et l'après. Que s'est-il passé ?La question que tout le monde se pose quand il faut améliorer l'exécution d'un traite-ment d'application est :Comment analyser et optimiser une requête SQL pour de meilleuresperformances ?

MySQL permet de collecter les requêtes exécutées sur l'instance.L'administrateur aura la charge de positionner le seuil de capture des requêtes jugéescomme lentes en utilisant le journal des requêtes lentes et en activant le paramètreslow_queries_log.

© E

dit

ions

EN

I -

All r

ights

rese

rved

148Performances et tuning

MySQL 5.6

2. Premiers pas dans l'optimisation SQL

Avant toute chose, il est nécessaire de collecter l'ensemble des requêtes qui sont exé-cutées au niveau de l'instance puis d'analyser le journal des requêtes.

2.1 Collecter les requêtes de l'instance

Le journal des requêtes permet de relever toutes les requêtes qui sont passées auniveau de l'instance selon un critère de seuil.La requête est alors journalisée uniquement après son exécution.Par défaut, la journalisation des requêtes est désactivée. C'est la variableslow_query_log qui renseigne sur l'état actif/inactif de la collecte des instructions.SHOW VARIABLES LIKE 'slow_query_lo%';

mysql> show variables like 'slow_query_lo%';+---------------------+-------+

| Variable_name | Value |+---------------------+-------+

| slow_query_log | OFF || slow_query_log_file | |

+---------------------+-------+2 rows in set (0.00 sec)

Ici, la journalisation des requêtes est désactivée. C'est le comportement par défaut.

Collecter les requêtesPour activer la capture, il faut positionner dans le fichier de configuration MySQLServer, le paramètre slow_query_log. La simple présence de ce paramètre seraconsidérée comme active au niveau de l'instance.

[mysqld]

slow_query_log -- ON | 1slow_query_log_file = /app/log_queries/slow_queries.log

long_query_time = 10

Le paramètre slow_query_log_file n'est pas obligatoire. Sans précision sur ceparamètre, le fichier de journalisation des requêtes est créé à l'emplacement desdonnées et porte le nom de hostname-slow.log.Un second paramètre est tout aussi important, le long_query_time. Par défaut ceparamètre est positionné à 10, c'est-à-dire que la collecte des requêtes est effective uni-quement dans une condition d'exécution de 10 secondes ou plus.

149Tuning des requêtesChapitre 7

Baisser cette valeur permet d'affiner la capture.mysql> show variables like 'long_query_time';+-----------------+-------+

| Variable_name | Value |+-----------------+-------+

| long_query_time | 10 |+-----------------+-------+

1 row in set (0.00 sec)

Ici, le long_query_time possède une configuration par défaut.Ce paramètre est dynamique et peut être changé au niveau du prompt MySQL client.

mysql/> set @@global.long_query_time = 0;

Query OK, 0 rows affected (0.00 sec)

Ici, le fait de positionner la valeur à 0 va provoquer la collecte de toutes les requêtesexécutées au niveau de l'instance.Ceci peut être particulièrement efficace pour identifier le comportement et le nombrede requêtes exécutées sur le serveur selon une période donnée.

Collecter les requêtes dans un fichier ou dans une tableLe paramètre log_output est configuré par défaut en tant que FILE. C'est-à-direque par défaut toutes les journalisations sont effectuées dans un fichier au formatASCII.Toutefois, il est également possible de journaliser les requêtes dans une table. Pourcela, il est nécessaire de surcharger ce paramètre avec la valeur TABLE.

[mysqld]

log_output = FILE, TABLE

Collecter les requêtes d'un nombre de lignes minimalesLe paramètre min_examined_row_limit permet d'examiner uniquement lesrequêtes dont le nombre de lignes minimales est renseigné.Par défaut, la valeur de ce paramètre est 0.

Collecter les requêtes sans indexUne variable système log_queries_not_using_indexes permet de collecteruniquement les requêtes n'utilisant pas d'index lors des instructions SQL.Toutes les requêtes SQL exécutées sans index seront collectées.

© E

dit

ions

EN

I -

All r

ights

rese

rved

150Performances et tuning

MySQL 5.6

Cette variable est à positionner dans le fichier de configuration de l'instance.[mysqld]slow_query_log

slow_query_log_file = /app/log_queries/slow_queries.loglong_query_time = 0

long_queries_not_using_indexes

Remarque

Dans les anciennes versions de MySQL, notamment en 5.1, le paramètrelong_slow_queries correspondait à slow_query_log en version 5.6.

2.2 Analyse des requêtes journalisées

2.2.1 Utilitaire d'analyse

MySQL met à disposition un utilitaire mysqldumpslow, qui permet d'analyser unfichier de journalisation de requêtes selon différents critères.

Définition des paramètres de mysqldumpslow

Paramètre Description

t, at Trié par le temps d'exécution des requêtes, par le temps moyen d'exécution des requêtes.

l, al Trié par le temps de verrouillage des requêtes, par le temps moyen de verrouillage des requêtes.

r, ar Trié par le temps d'envoi des requêtes, par le temps moyen d'envoi des requêtes.

c Trié par une valeur.

151Tuning des requêtesChapitre 7

2.2.2 Analyse des requêtes collectées

Analyse des requêtes les plus courantes#mysqldumpslow -t 3 -s c /app/log_queriers/slow_queries.log

Dans cet exemple, mysqldumpslow avec l'option -t renvoie les trois requêtes lesplus courantes.

[mysql@ol-mysql56-master app]$ mysqldumpslow -t 3 -s c

slow_queries.log

Reading mysql slow query log from slow_queries.logCount: 27423 Time=0.01s (15s) Lock=0.00s (14s) Rows=13.0

(1110538), mysql[mysql]@localhost SELECT ...

...

...

Count: 13812 Time=0.02s (105s) Lock=0.00s (1s) Rows=100.0

(27354), mysql[mysql]@localhost

© E

dit

ions

EN

I -

All r

ights

rese

rved

152Performances et tuning

MySQL 5.6

SELECT * FROM city_huge WHERE CountryCode like 'FR%' ORDER BY CountryCode LIMIT 100

Count: 6251 Time=0.00s (0s) Lock=0.00s (1s) Rows=0.0

(5093457), mysql[mysql]@localhost SELECT count(*) FROM city_big_huge

[mysql@ol-mysql56-master app]$

Analyse des requêtes les plus lentes#mysqldumpslow -t 3 -s at /app/log_queriers/slow_queries.log

Ici, l'option at renvoie les trois requêtes les plus lentes.

Analyse des requêtes possédant les plus gros résultats#mysqldumpslow -t 3 -s as /app/log_queriers/slow_queries.log

Ici, l'option as renvoie les trois requêtes disposant des plus gros résultats.

Analyse des requêtes possédant le plus d'interblocages#mysqldumpslow -t 3 -s al /app/log_queriers/slow_queries.log

Ici, l'option al renvoie les trois requêtes d'interblocage.

3. Contrôle des points d'optimisation

Pour optimiser les requêtes, il faut aussi veiller à ce que les points permettant d'assurerla bonne exécution soient cohérents au niveau de l'instance.

3.1 Contrôler les paramètres clés

MySQL Server offre la possibilité d'afficher certains paramètres clés en utilisantl'utilitaire mysqladmin.C'est l'option extended-status qui permet d'afficher les valeurs positionnées auniveau de l'instance.mysqladmin -uroot -p extended-status mysqladmun -uroot -p extended-status [ | grep {variable_name} ]