Optimisation des performances MySQL : qu'est-ce que le pushdown d'index ?
Introduction
Le pushdown des conditions d'index (index condition pushdown), appelé ICP, a été lancé dans la version Mysql5.6 et est utilisé pour optimiser les requêtes.
Lors d'une requête utilisant un index de clé non primaire (également appelé index normal ou index secondaire) sans utiliser ICP, le moteur de stockage récupère les données via l'index puis les renvoie au serveur MySQL. Le serveur détermine ensuite si le. les données remplissent les conditions.
Lors de l'utilisation d'ICP, s'il existe des conditions de jugement pour certaines colonnes indexées, le serveur MySQL transmettra cette partie des conditions de jugement au moteur de stockage, puis le moteur de stockage jugera si l'index répond aux conditions transmises par le serveur MySQL. . Uniquement Lorsque l'index remplit les conditions, les données seront récupérées et renvoyées au serveur MySQL.
L'optimisation du refoulement des conditions d'index peut réduire le nombre de fois où le moteur de stockage interroge la table sous-jacente, et peut également réduire le nombre de fois où le serveur MySQL reçoit des données du moteur de stockage.
【Apprentissage recommandé : Tutoriel vidéo mysql】
Ouvrir
Avant de commencer, préparez une table utilisateur (user), dont les principaux champs sont : id, nom, âge, adresse. Créez un index commun (nom, âge).
Supposons qu'il soit obligatoire de faire correspondre tous les utilisateurs dont le prénom est Chen. L'instruction SQL est la suivante :
SELECT * from user where name like '陈%'
Selon le principe du "meilleur préfixe gauche", un index conjoint (nom, âge) est utilisé ici pour requête, Les performances sont nettement supérieures à celles de l'analyse complète de la table.
La question est : et s'il y avait d'autres conditions ? Supposons qu'il existe une autre exigence pour faire correspondre les utilisateurs dont le prénom est Chen et dont l'âge est de 20 ans. L'instruction SQL à ce moment est la suivante :
SELECT * from user where name like '陈%' and age=20
Comment cette instruction SQL doit-elle être exécutée ? Ce qui suit est une analyse des versions avant et après Mysql5.6.
Version MySQL antérieure à 5.6
La version antérieure à 5.6 n'a pas l'optimisation du push down d'index, donc le processus d'exécution est le suivant :
ignorera le champ d'âge et interrogera directement par nom (nom. , âge) Deux résultats ont été trouvés sur l'arborescence dans cette leçon, avec des ID respectivement 2 et 1. Ensuite, les valeurs d'ID obtenues ont été renvoyées à la table pour interrogation encore et encore, ce processus a donc nécessité de revenir à la table deux fois.
Mysql5.6 et versions ultérieures
La version 5.6 ajoute l'optimisation du pushdown d'index. Le processus d'exécution est le suivant :
InnoDB n'ignore pas le champ d'âge, mais détermine l'âge à l'intérieur de l'index. est-il égal à 20 ? Les enregistrements qui ne sont pas égaux à 20 sont ignorés directement. Par conséquent, un seul enregistrement correspond dans l'arborescence d'index. À ce stade, utilisez cet ID pour revenir à la table dans l'index de clé primaire. arbre pour interroger toutes les données. Ce processus ne doit être retourné à la table qu'une seule fois.
Pratique
Bien sûr, l'analyse ci-dessus n'est qu'en principe, nous pouvons l'analyser dans la pratique, alors Chen a installé la version Mysql5.6 de Mysql et analysé la déclaration ci-dessus, comme indiqué ci-dessous :
Selon expliquer Les résultats de l'analyse montrent que la valeur de Extra est Utilisation de la condition d'index, ce qui signifie que le refoulement d'index a été utilisé.
Résumé
L'optimisation du refoulement d'index sur les index de clé non primaire peut réduire efficacement le nombre de retours de table et améliorer considérablement l'efficacité des requêtes.
Pour désactiver le pushdown d'index, vous pouvez utiliser la commande suivante. La modification du fichier de configuration ne sera plus décrite. Après tout, pourquoi une fonction aussi excellente devrait-elle être désactivée :
set optimizer_switch='index_condition_pushdown=off';
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!