" , évitez d'utiliser ou de connecter des conditions ; 3. Utilisez et non avec prudence."/> " , évitez d'utiliser ou de connecter des conditions ; 3. Utilisez et non avec prudence.">

Maison  >  Article  >  base de données  >  Comment MySQL effectue-t-il l’optimisation SQL ?

Comment MySQL effectue-t-il l’optimisation SQL ?

青灯夜游
青灯夜游original
2020-09-27 17:37:2710484parcourir

Méthodes d'optimisation SQL Mysql : 1. Évitez les analyses de table complètes et créez des index sur les colonnes impliquées dans Where et triez par ; 2. Évitez les jugements de valeur nuls sur les champs de la clause Where et évitez d'utiliser " !=" ou "a8093152e673feb7aba1828c43532094", évitez d'utiliser ou de connecter les conditions 3. Utilisez in et not in avec prudence.

Comment MySQL effectue-t-il l’optimisation SQL ?

Stratégies d'optimisation SQL courantes dans MySQL

1 Évitez l'analyse complète des tables

Pour optimiser la requête, vous devez essayer d'éviter les analyses de table complètes. Vous devez d'abord envisager de créer des index sur les colonnes impliquées dans Where et de les trier.

2 Évitez de juger les valeurs nulles
Vous devriez essayer d'éviter de juger les valeurs nulles pour les champs de la clause Where, sinon le moteur abandonnera l'utilisation l'index et continuez. Analyse complète de la table, telle que :

select id from t where num is null

Vous pouvez définir la valeur par défaut 0 sur num pour vous assurer qu'il n'y a pas de valeur nulle dans la colonne num de la table, puis interroger. comme ceci :

select id from t where num=0

3 Évitez les jugements d'inégalité

Vous devriez essayer d'éviter d'utiliser != ou a8093152e673feb7aba1828c43532094 dans la clause Where, sinon le moteur abandonnera l'utilisation des index et effectuera une analyse complète de la table.

4 Évitez d'utiliser ou de logique
Vous devriez essayer d'éviter d'utiliser ou dans la clause Where pour connecter des conditions, sinon cela provoquer l'abandon du moteur en utilisant les index et effectuer une analyse complète de la table, telle que :

select id from t where num=10 or num=20

peut être interrogé comme ceci :

select id from t where num=10
union all
select id from t where num=20

5 Utiliser dans et non avec prudence en logique
in et non dans doivent également être utilisés avec prudence, sinon cela entraînera une analyse complète de la table, telle que :
sélectionnez l'identifiant de t1 où num in(sélectionnez l'identifiant de t2 où id > ; 10)
À ce stade, la requête externe analysera la table entière sans utiliser d'index. Il peut être modifié comme :
sélectionnez l'identifiant de t1, (sélectionnez l'identifiant de t1 où id > 10)t2 où t1.id = t2.id
À ce stade, l'index est utilisé, ce qui peut considérablement améliorer efficacité des requêtes.

6 Notez les requêtes floues
La requête suivante entraînera également une analyse complète de la table :
sélectionnez l'identifiant dans t où un nom comme '%abc%'
Si une requête floue est une condition nécessaire, vous pouvez utiliser select id from t où un nom comme 'abc%' pour implémenter une requête floue, et l'index sera utilisé. Si la correspondance d'en-tête est une logique nécessaire, il est recommandé d'utiliser un moteur de recherche en texte intégral (Elastic search, Lucene, Solr, etc.).

7 Évitez les calculs de champs dans les conditions de requête
Vous devriez essayer d'éviter les opérations d'expression sur les champs dans la clause Where This Will. obliger le moteur à abandonner l'utilisation de l'index et à effectuer une analyse complète de la table. Par exemple :
sélectionnez l'identifiant à partir de t où num/2=100
doit être remplacé par :
sélectionnez l'identifiant à partir de t où num=100*2

8 Évitez d'effectuer des opérations fonctionnelles sur les champs dans les conditions de requête
Essayez d'éviter d'effectuer des opérations fonctionnelles sur les champs dans la clause Where, ce qui entraînera l'abandon du moteur d'utilisation de l'index et l'exécution une analyse complète de la table. Par exemple :
sélectionnez l'identifiant à partir de t où substring(name,1,3)='abc'--id dont le nom commence par abc
doit être remplacé par :
sélectionnez l'identifiant à partir de t où le nom ressemble à ' abc% '

9 Note sur le côté gauche de "=" dans la clause WHERE
Ne le fais pas sur le côté gauche de "=" dans les fonctions de la clause Where, les opérations arithmétiques ou autres opérations d'expression, sinon le système risque de ne pas utiliser l'index correctement.

10 Utilisation d'un index combiné
Lors de l'utilisation du champ d'index comme condition, si l'index est un index composite, vous devez utiliser Ce n'est que lorsque le premier champ de l'index est utilisé comme condition que le système peut utiliser l'index. Sinon, l'index ne sera pas utilisé et l'ordre des champs doit être autant que possible cohérent avec l'ordre de l'index.

11 Ne définissez pas de requêtes irréprochables
N'écrivez pas de requêtes dénuées de sens Par exemple, vous devez générer une structure de table vide. :
sélectionnez col1,col2 dans #t à partir de t où 1=0
Ce type de code ne renverra aucun jeu de résultats, mais il consommera des ressources système. Il doit être remplacé par ceci :
créer une table. #t(. ..)

12 existe
Souvent, c'est un bon choix d'utiliser exist au lieu de dans :
select num from a Where num in(select num from b)
Remplacez par l'instruction suivante :
select num from a Where Existe (sélectionnez 1 from b Where num=a.num)

13 Les index peuvent également échouer
Tous les index ne sont pas valides pour les requêtes. SQL optimise les requêtes en fonction des données de la table. S'il y a une grande quantité de données en double dans la colonne d'index, la requête SQL peut ne pas utiliser l'index. Par exemple, s'il y a un champ sexe dans une table et que près de la moitié sont des hommes et l'autre moitié des femmes, même si un index est construit. sur le sexe, cela n'aura aucun effet sur l'efficacité des requêtes.

14 Sélection du type de champ de tableau
Essayez d'utiliser des champs numériques si les champs contiennent uniquement des informations numériques, essayez de ne pas concevoir. sous forme de caractères, ce qui réduit les performances des requêtes et des jointures et augmente la surcharge de stockage. En effet, le moteur comparera chaque caractère de la chaîne un par un lors du traitement des requêtes et des connexions, et une seule comparaison suffit pour les types numériques.
Utilisez autant que possible varchar au lieu de char, car tout d'abord, les champs de longueur variable ont un petit espace de stockage et peuvent économiser de l'espace de stockage. Deuxièmement, pour les requêtes, l'efficacité de la recherche dans un champ relativement petit est évidemment plus élevée.

15 Champs dans la syntaxe de requête
N'utilisez pas select * from t nulle part, utilisez plutôt une liste de champs spécifique" *" , ne renvoie aucun champ non utilisé.

16 Optimisation indépendante de l'index
Ne pas utiliser *, essayez de ne pas utiliser union, union all et autres mots-clés, essayez ne pas utiliser de mots-clés, essayez d'utiliser un jugement équivalent.

Il est recommandé que le nombre de connexions de table ne dépasse pas 5. S’il y en a plus de 5, pensez à la conception de la table. (Dans les applications Internet)

Pour les méthodes de connexion par table, les liens externes sont meilleurs que les liens en ligne.
Les données de base existent dans les connexions externes. Par exemple : A gauche rejoint B, les données de base sont A.
Une jointure interne B, s'il n'y a pas de données de base, utilisez d'abord le produit cartésien pour terminer la jointure complète, puis obtenez l'ensemble de résultats de jointure interne en fonction des conditions de connexion.

Lors de l'exécution de requêtes de pagination sur de grandes tables de données, si le nombre de numéros de page est trop grand, utilisez des sous-requêtes pour compléter la logique de pagination.
Sélectionnez * dans la limite de la table 1000000, 10
Sélectionnez * dans la table où l'identifiant est dans (sélectionnez pk dans la limite de la table 100000, 10)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn