Résumé des méthodes d'optimisation des données MySQL

Enregistrement des notes d'étude de la base de données

1. Sélectionnez les attributs de champ les plus applicables

1. La largeur du champ doit être aussi petite que possible

MySQL peut bien prendre en charge l'accès à de grandes quantités de données, mais de manière générale, plus la table est petite dans la base de données, plus la requête est exécutée rapidement. Par conséquent, lors de la création d'une table, afin d'obtenir de meilleures performances, nous pouvons définir la largeur des champs de la table aussi petite que possible.
Par exemple, lors de la définition du champ de code postal, s'il est défini sur CHAR (255), cela ajoute évidemment de l'espace inutile à la base de données, et même l'utilisation de VARCHAR est redondante, car CHAR (6) peut être très bonne. . De même, si possible, nous devrions utiliser MEDIUMINT au lieu de BIGIN pour définir des champs entiers.

2. Essayez de définir le champ comme non NULL

Une autre façon d'améliorer l'efficacité consiste à essayer de définir le champ sur NOTNULL lorsque cela est possible, afin que la base de données n'ait pas besoin de comparer les valeurs NULL lors de l'exécution de requêtes à l'avenir.

3. Définissez les données de classification sur le type ENUM

Pour certains champs de texte, tels que "province" ou "gender", nous pouvons les définir comme type ENUM. Parce que dans MySQL, le type ENUM est traité comme des données numériques et les données numériques sont traitées beaucoup plus rapidement que le type de texte. De cette manière, nous pouvons améliorer les performances de la base de données.

Deux, utilisez la jointure (JOIN) au lieu des sous-requêtes (sous-requêtes)

L'utilisation de sous-requêtes peut effectuer de nombreuses opérations SQL qui nécessitent logiquement plusieurs étapes à la fois. En même temps, elle peut également éviter le verrouillage des transactions ou des tables, et il est facile d'écrire. Cependant, dans certains cas, les sous-requêtes peuvent être remplacées par des jointures plus efficaces (JOIN) ... Par exemple, supposons que nous souhaitons récupérer tous les utilisateurs qui n'ont aucun enregistrement de commande, nous pouvons utiliser la requête suivante pour terminer:

SELECT*FROM customer_info
WHERE customer_id  NOT IN (SELECT customer_id FROM sales_info)

Si vous utilisez JOIN ... pour terminer cette requête, la vitesse sera beaucoup plus rapide. Surtout quand il y a un index sur CustomerID dans la table sales_info, les performances seront meilleures. La requête est la suivante:

SELECT*FROM customer_info
LEFT JOIN sales_info ON customer_info.customer_id=sales_info.customer_id
WHERE sales_info.customer_id IS NULL

La raison pour laquelle JOIN est plus efficace est que MySQL n'a pas besoin de créer une table temporaire en mémoire pour terminer cette requête logique en deux étapes.

Troisièmement, utilisez union (UNION) au lieu de la table temporaire créée manuellement

L'opérateur UNION est utilisé pour combiner les jeux de résultats d'au moins deux instructions SELECT.
Notez que chaque instruction SELECT dans UNION doit avoir le même nombre de colonnes. Les colonnes doivent également avoir des types de données similaires. En même temps, l'ordre des colonnes dans chaque instruction SELECT doit être le même.

MySQL prend en charge les requêtes UNION depuis la version 4.0. Il peut combiner deux requêtes SELECT ou plus nécessitant des tables temporaires en une seule requête. À la fin de la session de requête du client, la table temporaire sera automatiquement supprimée pour garantir que la base de données est ordonnée et efficace. Lorsque vous utilisez UNION pour créer une requête, nous devons uniquement utiliser UNION comme mot-clé pour connecter plusieurs instructions de sélection.

Quatrièmement, utilisez les transactions (Transaction) pour assurer la cohérence des données et améliorer la vitesse

Bien que nous puissions utiliser des sous-requêtes (sous-requêtes), des jointures (JOIN) et des unions (UNION) pour créer une variété de requêtes, toutes les opérations de base de données ne peuvent pas être effectuées avec une ou quelques instructions SQL de. Le plus souvent, il est nécessaire d'utiliser une série d'énoncés pour effectuer une sorte de travail. Mais dans ce cas, lorsqu'une certaine instruction du bloc d'instructions s'exécute de manière incorrecte, le fonctionnement de l'ensemble du bloc d'instructions devient incertain. Imaginez que si vous souhaitez insérer certaines données dans deux tables liées en même temps, il peut y avoir une telle situation: une fois la première table mise à jour avec succès, la base de données apparaît soudainement inattendue, ce qui empêche l'opération dans la deuxième table terminé, de cette façon, cela entraînera des données incomplètes, et même détruit les données de la base de données.
Pour éviter cette situation, vous devez utiliser la transaction, son rôle est:

  1. Soit toutes les instructions du bloc d'instructions ont réussi, soit toutes ont échoué. En d'autres termes, la cohérence et l'intégrité des données de la base de données peuvent être maintenues. Les choses commencent par le mot-clé BEGIN et se terminent par le mot-clé COMMIT. En attendant, une opération SQL échoue, puis la commande ROLLBACK peut restaurer la base de données à l'état avant le démarrage de BEGIN.
  2. Une autre fonction importante de la transaction est que lorsque plusieurs utilisateurs utilisent la même source de données en même temps, elle peut utiliser la méthode de verrouillage de la base de données pour fournir aux utilisateurs une méthode d'accès sûre, ce qui peut garantir que le fonctionnement de l'utilisateur n'est pas perturbé par d'autres utilisateurs.
  3. Rédigé sous la forme de transactions, il n'est pas nécessaire de se connecter à la base de données plusieurs fois, ce qui peut améliorer les performances et augmenter la vitesse d'ajout, de suppression, de vérification et de modification.
BEGIN; //或start transaction
INSERT INTO salesinfo SET CustomerID=14;//语句1
UPDATE inventory SET Quantity=11 WHERE item='book';//语句2
COMMIT;
//若失败如 
//if(update失败) {rollback} 

Un exemple courant est le virement bancaire. Le compte A transfère cent millions (T1) au compte B. Dans le processus de ce type de transaction, il y a plusieurs questions à se poser:
comment s'assurer simultanément que les transactions ci-dessus

Le montant total du compte A diminue de 100 millions et le montant total du compte B augmente de 100 millions? A
A et C en même temps le compte si la transaction du compte (T2), comment faire deux transactions indépendamment l'une de l'autre? I
Si la transaction est terminée d'un effondrement soudain de la base de données, comment garantir le succès des données de transaction stockées dans la base de données?
Comment D assurer la légitimité des données (aucune monnaie n'est créée ou disparue de rien) tout en supportant un grand nombre de transactions? C.
Pour garantir que la transaction se déroule normalement et de manière fiable, la base de données doit résoudre les quatre problèmes ci-dessus. C'est le contexte de la naissance de la transaction. Elle peut résoudre les quatre problèmes ci-dessus. En conséquence, elle présente quatre caractéristiques principales: à savoir ACID

  • Atomicité: la transaction est soit terminée, soit annulée. Si la transaction plante, l'état revient à avant la transaction (la transaction est annulée). Ils sont inséparables.
  • Isolement: Si deux transactions T1 et T2 s'exécutent en même temps, les résultats finaux des transactions T1 et T2 sont les mêmes, peu importe
    qui termine T1 et T2 en premier. L'isolement peut être résolu par verrouillage.
  • Durabilité: une fois la transaction validée, quoi qu'il arrive (comme un plantage ou une erreur de la base de données), les données peuvent toujours être stockées dans la base de données. Lorsque la base de données est redémarrée après un plantage pour des raisons irrésistibles, cela garantira que les données seront enregistrées sur le disque pour les transactions validées avec succès, et les données correspondantes seront restaurées pour les transactions non validées.
  • Cohérence: Seules les données légales (en fonction des contraintes relationnelles et des contraintes fonctionnelles) peuvent être écrites dans la base de données. Pour vous assurer que l'argent ne surgit pas ou ne disparaît pas de rien dans le système, comptez sur l'atomicité et l'isolation.

La base de données atteint cet objectif grâce au journal des transactions

  • Si vous écrivez sur le disque à chaque mise à jour, parce que les données sont aléatoires, cela entraînera beaucoup d'E / S aléatoires et les performances seront très médiocres.
  • Si vous n'écrivez pas sur le disque immédiatement après chaque mise à jour, une fois la base de données plantée, les données seront perdues

Le compromis est:

  • Les modifications de données sont ajoutées à la mémoire tampon du journal dans un ordre chronologique sous la forme d'un journal des transactions et écrites dans le journal des transactions par un algorithme spécifique. Il s'agit d'une E / S séquentielle, avec de meilleures performances
    . Le journal des transactions est analysé par le gestionnaire de données et écrit par un algorithme spécifique.

Il existe également le concept de niveau d'isolation pour les transactions. Différents niveaux de verrous d'isolation peuvent être ajoutés à différentes entreprises pour améliorer les performances.

Cinq, verrouille la table

Bien que la transaction soit un très bon moyen de maintenir l'intégrité de la base de données, mais en raison de son exclusivité, elle affecte parfois les performances de la base de données, en particulier dans un grand système d'application. Étant donné que la base de données sera verrouillée pendant l'exécution de la transaction, les autres demandes des utilisateurs ne peuvent attendre que temporairement jusqu'à la fin de la transaction. Si un système de base de données n'est utilisé que par quelques utilisateurs, l'impact des transactions ne deviendra pas un gros problème; mais s'il y a des milliers d'utilisateurs accédant à un système de base de données en même temps, par exemple, accédant à un site Web de commerce électronique, il produira un délai de réponse plus sérieux.

En fait, dans certains cas, nous pouvons obtenir de meilleures performances en verrouillant la table. L'exemple suivant utilise la méthode de verrouillage de la table pour terminer la fonction de transaction dans l'exemple précédent.

LOCK TABLE inventory WRITE SELECT Quantity FRO Minventory WHERE Item='book';
//一些计算写在这里
UPDATE inventory SET Quantity=11 WHERE Item='book';
UNLOCK TABLES

Ici, nous utilisons une instruction select pour récupérer les données initiales et, grâce à certains calculs, mettons à jour la nouvelle valeur dans la table avec une instruction de mise à jour. L'instruction LOCK TABLE contenant le mot clé WRITE peut garantir qu'il n'y aura aucun autre accès pour insérer, mettre à jour ou supprimer l'inventaire avant que la commande UNLOCK TABLES ne soit exécutée.

Six, utilisez des clés étrangères

La méthode de verrouillage de la table peut maintenir l'intégrité des données, mais elle ne peut garantir la pertinence des données. À ce stade, nous pouvons utiliser des clés étrangères.

Par exemple, les clés étrangères peuvent garantir que chaque enregistrement de vente pointe vers un client existant. Ici, la clé étrangère peut mapper le CustomerID de la table customerinfo avec le CustomerID de la table salesinfo. Tout enregistrement sans CustomerID valide ne sera pas mis à jour ou inséré dans salesinfo.

 
CREATE TABLE customerinfo( CustomerID INT NOT NULL,PRIMARYKEY(CustomerID)) TYPE=INNODB;
CREATE TABLE salesinfo( SalesID INT NOT NULL,CustomerID INT NOT NULL,PRIMARYKEY(CustomerID,SalesID),
FOREIGN KEY(CustomerID)REFERENCES customerinfo(CustomerID)ON DELETE CASCADE)TYPE=INNODB;

Notez le paramètre "ON DELETE CASCADE" dans l'exemple. Ce paramètre garantit que lorsqu'un enregistrement client dans la table customerinfo est supprimé, tous les enregistrements liés au client dans la table salesinfo seront également supprimés automatiquement.
Si vous souhaitez utiliser des clés étrangères dans MySQL, vous devez vous rappeler de définir le type de la table comme type InnoDB sécurisé pour les transactions lorsque vous créez la table. Ce type n'est pas le type par défaut des tables MySQL. La méthode de définition consiste à ajouter TYPE = INNODB à l'instruction CREATETABLE. Comme le montre l'exemple.

Sept, utilisez l'index

L'indexation peut utiliser la première lettre A, B, C ... disposée dans le dictionnaire pour aider à comprendre, par exemple, lorsque nous ajoutons un index aux données, nous pouvons trouver rapidement les données en fonction de la "lettre initiale" au lieu de chaque élément Aller à la recherche.
En particulier lorsque l'instruction de requête contient des commandes MAX (), MIN () et ORDERBY, l'utilisation d'index peut améliorer les performances de la base de données de manière plus significative.

Quels champs doivent être indexés?

De manière générale, l'index doit être construit sur les champs qui seront utilisés pour le jugement JOIN, WHERE et le tri ORDERBY.
Remarque: essayez de ne pas indexer un champ de la base de données contenant beaucoup de valeurs répétées. Pour un champ de type ENUM, il est très probable qu'il y ait un grand nombre de valeurs en double

Le fonctionnement détaillé de l'index et la différence entre l'index à colonne unique et l'index combiné peuvent être trouvés dans le lien suivant (Examens fréquents pour l'interview de Program Ape)
https://blog.csdn.net/S_ZaiJiangHu/article/details/114420976

8. Instruction de requête optimisée

Dans la plupart des cas, l'utilisation d'index peut améliorer la vitesse des requêtes, mais si l'instruction SQL n'est pas utilisée correctement, l'index ne pourra pas jouer le rôle qui lui revient.

Voici quelques aspects auxquels il convient de prêter attention.

Tout d'abord, il est préférable de comparer les opérations entre des champs du même type.

Avant MySQL 3.23, c'était même une condition nécessaire. Par exemple, un champ INT indexé ne peut pas être comparé à un champ BIGINT; cependant, dans un cas particulier, lorsque la taille du champ d'un champ de type CHAR et d'un champ de type VARCHAR sont identiques, ils peuvent être comparés.

Deuxièmement, essayez de ne pas utiliser les fonctions pour les opérations sur les champs indexés.

Par exemple, lorsque la fonction YEAE () est utilisée sur un champ de type DATE, l'index ne fonctionnera pas comme il se doit. Par conséquent, bien que les deux requêtes suivantes renvoient les mêmes résultats, la dernière est beaucoup plus rapide que la première.

Troisièmement, lorsque nous recherchons des champs de caractères, nous utilisons parfois des mots clés LIKE et des caractères génériques. Bien que cette approche soit simple, elle se fait également au détriment des performances du système.
Par exemple, la requête suivante comparera chaque enregistrement de la table.

SELECT * FROMbooks

WHEREnamelike "MySQL%"

Mais si vous passez à la requête suivante, le résultat sera le même, mais la vitesse sera beaucoup plus rapide:

SELECT * FROMbooks

WHEREnom > = "MySQL" et nom < "MySQM"

Enfin, veillez à ne pas laisser MySQL effectuer une conversion automatique de type dans la requête, car le processus de conversion rendra également l'index inopérant.

Je suppose que tu aimes

Origine blog.csdn.net/S_ZaiJiangHu/article/details/114414778
conseillé
Classement