Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Résolution des problèmes de performance des requêtes pour les bases de données Aurora MySQL
MySQL permet de contrôler l'optimiseur de requêtes
Les performances des requêtes dépendent de nombreux facteurs, notamment le plan d'exécution, le schéma et la taille de la table, les statistiques, les ressources, les index et la configuration des paramètres. Le réglage des requêtes nécessite d'identifier les goulots d'étranglement et d'optimiser le chemin d'exécution.
-
Trouvez le plan d'exécution de la requête et vérifiez si celle-ci utilise les index appropriés. Vous pouvez optimiser votre requête en utilisant
EXPLAIN
et en consultant les détails de chaque plan. -
Aurora MySQL version 3 (compatible avec MySQL 8.0 Community Edition) utilise une
EXPLAIN ANALYZE
instruction. L'EXPLAIN ANALYZE
instruction est un outil de profilage qui indique où MySQL consacre du temps à votre requête et pourquoi. Aurora MySQL planifie, prépare et exécute la requête tout en comptant les lignes et en mesurant le temps passé à différents moments du plan d'exécution.EXPLAIN ANALYZE
Lorsque la requête est terminée,EXPLAIN ANALYZE
imprime le plan et ses mesures au lieu du résultat de la requête. -
Mettez à jour les statistiques de votre schéma à l'aide de l'
ANALYZE
instruction. L'optimiseur de requêtes peut parfois choisir de mauvais plans d'exécution en raison de statistiques obsolètes. Cela peut nuire aux performances d'une requête en raison d'estimations de cardinalité inexactes à la fois des tables et des index. Lalast_update
colonne de la table innodb_table_statsindique la dernière mise à jour des statistiques de votre schéma, ce qui est un bon indicateur de « obsolescence ». -
D'autres problèmes peuvent survenir, tels que le biais de distribution des données, qui ne sont pas pris en compte pour la cardinalité des tables. Pour plus d'informations, consultez Estimation de la complexité de la table ANALYZE pour les tables InnoDB
et statistiques d'histogramme dans MySQL dans la documentation MySQL .
Comprendre le temps consacré aux requêtes
Les méthodes suivantes permettent de déterminer le temps passé par les requêtes :
- Profilage
-
Par défaut, le profilage est désactivé. Activez le profilage, puis exécutez la requête lente et vérifiez son profil.
SET profiling = 1;
Run your query.
SHOW PROFILE;-
Identifiez l'étape où vous passez le plus de temps. Selon les états généraux des threads
de la documentation MySQL, la lecture et le traitement des lignes d'une SELECT
instruction constituent souvent l'état le plus long de la durée de vie d'une requête donnée. Vous pouvez utiliser cetteEXPLAIN
instruction pour comprendre comment MySQL exécute cette requête. -
Consultez le journal des requêtes lentes pour évaluer
rows_examined
etrows_sent
vous assurer que la charge de travail est similaire dans chaque environnement. Pour plus d’informations, consultez Journalisation pour les bases de données Aurora MySQL. -
Exécutez la commande suivante pour les tables faisant partie de la requête identifiée :
SHOW TABLE STATUS\G;
-
Capturez les résultats suivants avant et après l'exécution de la requête sur chaque environnement :
SHOW GLOBAL STATUS;
-
Exécutez les commandes suivantes sur chaque environnement pour voir si une autre requête/session influence les performances de cet exemple de requête.
SHOW FULL PROCESSLIST; SHOW ENGINE INNODB STATUS\G;
Parfois, lorsque les ressources du serveur sont occupées, cela a un impact sur toutes les autres opérations du serveur, y compris les requêtes. Vous pouvez également saisir des informations périodiquement lorsque des requêtes sont exécutées ou configurer une
cron
tâche pour capturer des informations à des intervalles utiles.
-
- Schéma de performance
-
Le schéma de performance fournit des informations utiles sur les performances d'exécution du serveur, tout en ayant un impact minimal sur ces performances. Ceci est différent du
information_schema
, qui fournit des informations de schéma sur l'instance de base de données. Pour plus d’informations, consultez Présentation du schéma de performance pour Performance Insights on Aurora My SQL My SQL. - Suivi de l'optimiseur de requêtes
-
Pour comprendre pourquoi un plan de requête particulier a été choisi pour être exécuté
, vous pouvez le configurer pour accéder optimizer_trace
à l'optimiseur de requêtes MySQL.Exécutez un suivi de l'optimiseur pour afficher des informations détaillées sur tous les chemins disponibles pour l'optimiseur et sur son choix.
SET SESSION OPTIMIZER_TRACE="enabled=on"; SET optimizer_trace_offset=-5, optimizer_trace_limit=5; -- Run your query. SELECT * FROM table WHERE x = 1 AND y = 'A'; -- After the query completes: SELECT * FROM information_schema.OPTIMIZER_TRACE; SET SESSION OPTIMIZER_TRACE="enabled=off";
Révision des paramètres de l'optimiseur de requêtes
La version 3 d'Aurora MySQL (compatible avec MySQL 8.0 Community Edition) comporte de nombreuses modifications liées à l'optimiseur par rapport à la version 2 d'Aurora MySQL (compatible avec MySQL 5.7 Community Edition). Si vous avez des valeurs personnalisées pour leoptimizer_switch
, nous vous recommandons de vérifier les différences entre les valeurs par défaut et de définir optimizer_switch
les valeurs les mieux adaptées à votre charge de travail. Nous vous recommandons également de tester les options disponibles pour Aurora MySQL version 3 afin d'examiner les performances de vos requêtes.
Note
Aurora MySQL version 3 utilise la valeur par défaut de la communauté de 20 pour le paramètre innodb_stats_persistent_sample_pages
Vous pouvez utiliser la commande suivante pour afficher les optimizer_switch
valeurs :
SELECT @@optimizer_switch\G;
Le tableau suivant indique les optimizer_switch
valeurs par défaut pour les versions 2 et 3 d'Aurora MySQL.
Paramètre | Aurora MySQL version 2 | Aurora MySQL version 3 |
---|---|---|
batched_key_access |
off | off |
block_nested_loop |
on | on |
condition_fanout_filter |
on | on |
derived_condition_pushdown |
– | on |
derived_merge |
on | on |
duplicateweedout |
on | on |
engine_condition_pushdown |
on | on |
firstmatch |
on | on |
hash_join |
off | on |
hash_join_cost_based |
on | – |
hypergraph_optimizer |
– | off |
index_condition_pushdown |
on | on |
index_merge |
on | on |
index_merge_intersection |
on | on |
index_merge_sort_union |
on | on |
index_merge_union |
on | on |
loosescan |
on | on |
materialization |
on | on |
mrr |
on | on |
mrr_cost_based |
on | on |
prefer_ordering_index |
on | on |
semijoin |
on | on |
skip_scan |
– | on |
subquery_materialization_cost_based |
on | on |
subquery_to_derived |
– | off |
use_index_extensions |
on | on |
use_invisible_indexes |
– | off |
Pour plus d'informations, consultez les sections Optimisations commutables (MySQL 5.7