[Mysql] Plusieurs méthodes d'optimisation SQL couramment utilisées, 19 techniques d'optimisation SQL les plus efficaces (reproduites)

前言

Réimpression

有哪些方法

Réimprimé à partir de: https://www.changchenghao.cn/n/174426.html

  1. EXPLAIN
    fait l'optimisation de MySQL, nous devons faire bon usage d'EXPLAIN pour visualiser le plan d'exécution SQL.
    Voici un exemple simple, étiquetant (1, 2, 3, 4, 5) les données sur lesquelles nous voulons nous concentrer:
    Insérez la description de l'image ici

    • Colonne de type, type de connexion. Une bonne instruction SQL doit au moins atteindre le niveau de la plage. Mettez fin à tous les niveaux.
    • La colonne clé, le nom d'index utilisé. Si aucun index n'est sélectionné, la valeur est NULL. L'indexation obligatoire peut être adoptée.
    • Colonne key_len, longueur de l'index.
    • La colonne des lignes, le nombre de lignes à analyser. Cette valeur est une valeur estimée.
    • Colonne supplémentaire, description détaillée. Notez que les valeurs non conviviales courantes sont les suivantes: Utilisation du tri de fichiers, Utilisation de temporaire.
  2. La valeur de IN dans l'instruction SQL ne doit pas être trop élevée

  3. L'instruction SELECT doit spécifier le nom du champ

  4. Lorsqu'une seule donnée est nécessaire, utilisez la limite 1

  5. Si le champ de tri n'utilise pas l'index, essayez de trier le moins possible

  6. S'il n'y a pas d'index dans d'autres champs de la condition de restriction, utilisez ou le moins possible

  7. Essayez d'utiliser l'union tout au lieu de l'union

  8. Ne pas utiliser ORDER BY RAND ()
    select id from dynamicorder by rand () limit 1000; L'
    instruction SQL ci-dessus peut être optimisée pour:
    select id from dynamict1 join (select rand () * (select max (id) from dynamic) as nid) t2 sur t1.id> t2.nidlimit 1000;

  9. Distinguer entre in et existe, pas dans et n'existe pas
    select * from table A where id in (select id from table B) L'
    instruction SQL ci-dessus équivaut à
    select * from table A where exists (select * from table B where table B. id = table A.id) La
    distinction entre in et existe est principalement causée par le changement de séquence de pilotage (c'est la clé des changements de performances). Si elle existe, alors la table externe est la table de pilotage et est accessible en premier Si c'est IN, la sous-requête est exécutée en premier. Par conséquent, IN convient au cas où la surface extérieure est grande et la surface intérieure est petite; EXISTS convient au cas où la surface extérieure est petite et la surface intérieure est grande.
    En ce qui concerne pas dans et pas existe, il est recommandé d'utiliser pas existe.Ce n'est pas seulement un problème d'efficacité, mais pas en peut avoir des problèmes de logique. Comment écrire efficacement une instruction SQL qui remplace n'existe pas? Instruction
    SQL d'origine:
    sélectionnez colname… à partir d'une table où a.id pas dans (sélectionnez b.id dans la table B) Instruction
    SQL efficace:
    sélectionnez colname… à partir d'une table Joindre à gauche la table B sur où a.id = b.id où
    Le l'ensemble de résultats obtenu par b.id est nul est montré dans la figure suivante, les données du tableau A ne sont pas du tableau B:
    Insérez la description de l'image ici

  10. Utilisez des méthodes de pagination raisonnables pour améliorer l'efficacité de la pagination
    select id, name from product limit 866613, 20
    Lors de l'utilisation de l'instruction SQL ci-dessus pour la pagination, certaines personnes peuvent constater qu'à mesure que la quantité de données de table augmente, l'utilisation directe des requêtes de pagination de limite augmente Le plus lent.
    La méthode d'optimisation est la suivante: vous pouvez prendre l'identifiant du nombre maximum de lignes sur la page précédente, puis limiter le point de départ de la page suivante en fonction de cet identifiant maximum. Par exemple, dans cette colonne, le plus grand identifiant de la page précédente est 866612. SQL peut être écrit comme suit:
    sélectionnez id, nom du produit où id> 866612 limite 20

  11. Requête de segment
    Dans certaines pages de sélection d'utilisateurs, certains utilisateurs peuvent sélectionner une plage de temps trop longue, ce qui entraîne une requête lente. La raison principale est qu'il y a trop de lignes de balayage. À ce stade, vous pouvez utiliser le programme, segmenter pour interroger, parcourir en boucle et fusionner les résultats pour l'affichage.
    Dans l'instruction SQL comme indiqué ci-dessous, une requête segmentée peut être utilisée lorsque les lignes analysées sont supérieures à des millions de niveaux:
    Insérez la description de l'image ici

  12. Évitez le jugement de valeur nul du champ dans la clause where. Le
    jugement nul obligera le moteur à abandonner l'utilisation de l'index et à effectuer une analyse complète de la table.

  13. Il n'est pas recommandé d'utiliser des requêtes floues avec le préfixe%,
    telles que LIKE "% name" ou LIKE "% name%". Ce type de requête entraînera l'échec de l'index et effectuera une analyse complète de la table. Mais vous pouvez utiliser LIKE "nom%".
    Comment interroger% name%?
    Comme le montre la figure ci-dessous, bien qu'un index soit ajouté au champ secret, il n'est pas utilisé dans le résultat de l'explication: l'
    Insérez la description de l'image ici
    écriture de SQL se souvient de ces 19 principes d'optimisation, et l'efficacité est augmentée d'au moins 3 fois.
    Alors, comment résoudre ce problème problème, la réponse: utilisez un index de texte intégral.
    Nous utilisons souvent select id, fnum, fdst de dynamic_201606 où user_name comme '% zhangsan%'; dans nos requêtes. Pour de telles instructions, les index ordinaires ne peuvent pas répondre aux exigences de la requête. Heureusement, dans MySQL, il existe un index de texte intégral pour nous aider.
    Créer un index de texte intégral de la syntaxe SQL est:
    le ALTER TABLE dynamic_201606le ADD FULLTEXT INDEX idx_user_name( user_name); en
    utilisant un index de texte intégral des instructions SQL sont:
    le SELECT l'id mentionné ci-dessus, FNUM, fdst de dynamic_201606 la correspondance WHERE (nom_utilisateur) Contre ('zhangsan' en booléen le MODE);
    Remarque: avant de créer un index de texte intégral, veuillez contacter le DBA pour déterminer s'il peut être créé. Dans le même temps, vous devez faire attention à la différence entre l'instruction de requête et l'index ordinaire.

  14. Évitez d'effectuer des opérations d'expression sur les champs de la clause where. Par
    exemple:
    sélectionnez user_id, user_project dans user_base où age * 2 = 36; effectue des
    opérations arithmétiques sur les champs, ce qui entraînera l'abandon par le moteur des index. Il est recommandé de changer pour:
    sélectionnez user_id, user_project dans user_base où age = 36/2;

  15. Pour éviter la conversion de type
    qui se produit lorsque le type du champ de colonne dans la clause where n'est pas cohérent avec le type du paramètre passé dans la conversion de type implicite , il est recommandé de déterminer le type de paramètre dans where first.

  16. Pour l'index conjoint, la règle de préfixe la plus à gauche doit être suivie.
    Par exemple, l'index contient les champs id, name et school. Le champ id peut être utilisé directement, ou l'ordre de id, name peut être utilisé, mais name ; l'école ne peut pas utiliser cet index. Par conséquent, lors de la création d'un index conjoint, vous devez faire attention à l'ordre des champs d'index. Les champs de requête couramment utilisés sont placés en premier.

  17. Si nécessaire, vous pouvez utiliser forcer l'index pour forcer une requête à accéder à un index.
    Parfois, l'optimiseur MySQL utilise l'index qu'il juge approprié pour récupérer des instructions SQL, mais l'index qu'il utilise peut ne pas être ce que nous voulons. À ce stade, forceindex peut être utilisé pour forcer l'optimiseur à utiliser notre index.

  18. Faites attention à l'instruction de requête de plage
    Pour l'index conjoint, s'il existe une requête de plage, comme entre,>, <et d'autres conditions, les champs d'index suivants deviendront invalides.

  19. En ce qui concerne l'optimisation de JOIN, la
    Insérez la description de l'image ici
    table LEFT JOIN A est la table de pilotage, INNER JOIN MySQL trouvera automatiquement la table avec moins de données pour agir comme table de pilotage, et la table RIGHT JOIN B est la table de pilotage.
    Remarque:
    1) Il n'y a pas de jointure complète dans MySQL, cela peut être résolu de la manière suivante:
    sélectionnez * à partir de A jointure gauche B sur B.nom = A.nom où B.nom est nullunion allselect * à partir de B;
    2) Essayez de utiliser une jointure interne pour éviter la jointure à gauche: il
    y a au moins deux tables participant à la requête conjointe, et il y a généralement des différences de taille. Si la méthode de connexion est une jointure interne, MySQL sélectionnera automatiquement la petite table comme table de pilotage sans autres conditions de filtrage, mais la jointure de gauche suit le principe du pilotage à gauche à droite dans la sélection de la table de pilotage, c'est-à-dire le nom de la table à gauche de la jointure de gauche Pour la table de conduite.
    3) Utilisation raisonnable des index:
    le champ d'index de la table pilotée est utilisé comme champ restreint de on.
    4) Utilisez une petite table pour piloter une grande table:
    Insérez la description de l'image ici
    il peut être vu intuitivement à partir du diagramme schématique que si la table de pilotage peut être réduite, le nombre de boucles dans la boucle imbriquée peut être réduit pour réduire la quantité totale d'E / S et le nombre d'opérations du processeur.
    5) Utilisez STRAIGHT_JOIN habilement:
    La jointure interne est sélectionnée par MySQL pour piloter la table, mais dans certains cas particuliers, vous devez sélectionner une autre table comme table de pilotage, telle que «Utilisation du tri de fichiers» ou «Utilisation de temporaire», comme grouper par et classer par. STRAIGHT_JOIN pour forcer l'ordre de connexion, le nom de la table à gauche de STRAIGHT_JOIN est la table pilote et la table à droite est la table pilotée. Une condition préalable à l'utilisation de STRAIGHT_JOIN est que la requête soit une jointure interne, qui est une jointure interne. STRAIGHT_JOIN n'est pas recommandé pour les autres liens, sinon les résultats de la requête peuvent être inexacts.
    Insérez la description de l'image ici
    Cette méthode peut parfois réduire le temps de 3 fois.

Je suppose que tu aimes

Origine blog.csdn.net/s1441101265/article/details/115008879
conseillé
Classement