Plusieurs façons d'optimiser la base de données MySQL (doit demander lors d'un entretien écrit)

Plateforme auteur :

| RPSC : blog.csdn.net/qq_4115394…

| Pépites : juejin.cn/user/651387…

| Zhihu : www.zhihu.com/people/1024…

| GitHub : github.com/JiangXia-10…

| Compte officiel : 1024 notes

Cet article a un total de 3929 mots, et le temps de lecture estimé est de 10 minutes

avant-propos

J'ai récemment changé d'emploi. J'ai passé des entretiens il y a quelque temps et certaines questions ont été posées fréquemment. Voici quelques tris et résumés, dans l'espoir d'aider les étudiants qui envisagent également de trouver un emploi.

Parmi eux, des questions sur la base de données sont fréquemment posées, et la fréquence de la base de données, en particulier les connaissances sur l'optimisation de la base de données, est demandée par pratiquement toutes les entreprises. Voici donc un résumé du contenu sur l'optimisation de base de données, dont certains sont mon expérience de développement habituelle, et certains sont mon propre contenu d'apprentissage. Donc, s'il y a quelque chose qui ne va pas, discutez-en et corrigez-moi !

texte

En fait, l'optimisation de la base de données ne fait pas seulement beaucoup de questions dans l'entretien écrit, mais aussi parce que dans le travail proprement dit, l'optimisation de la base de données peut affecter les performances du système, et c'est en effet très important, donc il est souvent nécessaire d'écrire un script sql raisonnable, et d'optimiser la base de données. L'optimisation de la base de données peut principalement être envisagée sous les aspects suivants :

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

MySQL peut bien supporter l'accès à de grandes quantités de données, mais d'une manière générale, plus la table de la base de données est petite, plus la requête exécutée dessus est rapide. Par conséquent, lors de la création d'une table, afin d'obtenir de meilleures performances, nous pouvons définir la taille des champs de la table aussi raisonnable que possible, et il n'est pas nécessaire de sélectionner le plus grand.

Par exemple, si le champ username est défini dans la table user et défini sur varchar(255), cela ajoutera évidemment de l'espace inutile à la base de données, car nous savons que le nom ne peut de toute façon pas atteindre une longueur aussi longue. même.

Une autre façon d'améliorer l'efficacité consiste à définir le champ sur NOT NULL chaque fois que 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.

Pour certains champs de texte, tels que "gender", nous pouvons les définir comme étant de 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 texte. De cette façon, nous pouvons améliorer les performances de la base de données.

2. Table de conception raisonnable

Pour la conception des tables mysql, il est préférable de suivre les principes suivants :

a. La quantité de données dans une seule table

Toutes les tables doivent ajouter des commentaires, et il est recommandé de contrôler le volume de données d'une seule table dans les 30 millions ;

Essayez de ne pas enregistrer de données volumineuses sur le terrain, par exemple en ne stockant pas de données volumineuses telles que des images et des fichiers dans la base de données ;

b. Spécification d'utilisation du tableau

Les grands champs et les champs à faible fréquence d'accès doivent être divisés pour séparer les données chaudes et froides ;

Lors de la création d'une table de données, essayez de contrôler le nombre de champs dans une seule table dans les 20 champs ;

C. Spécification de l'indice

La création d'index peut grandement améliorer l'efficacité de l'accès aux données, mais les index doivent être créés raisonnablement, tels que :

1. Le nombre d'index dans une seule table ne dépasse pas 5 et le nombre de champs dans un seul index ne dépasse pas 5 ;

2. Il est recommandé d'utiliser des colonnes auto-incrémentées pour la clé primaire INNODB. La clé primaire ne doit pas être modifiée et la chaîne ne doit pas être utilisée comme clé primaire. Si la clé primaire n'est pas spécifiée, INNODB utilisera un et index non nul à la place ;

3. S'il s'agit d'un index composite, le champ avec la plus grande distinction est placé devant l'index ;

4. Éviter les index redondants ou en double : créer raisonnablement des index conjoints (éviter la redondance) ;

5. Ne construisez pas d'index sur des colonnes à faible cardinalité, telles que des champs tels que « sexe » ;

6. N'effectuez pas d'opérations mathématiques et d'opérations de fonction sur les colonnes d'index

Certaines méthodes d'utilisation incorrectes des index entraîneront un échec de l'index. Vous pouvez vous référer à l'article précédent : Plusieurs compétences d'optimisation SQL à maîtriser (7) : La meilleure utilisation des index

3. Utilisez des jointures (JOIN) au lieu de sous-requêtes (Sub-Queries)

Nous avons souvent besoin d'utiliser certaines sous-requêtes pour utiliser les résultats de la requête comme conditions dans une autre requête. MySQL prend en charge les sous-requêtes SQL depuis la version 4.1. Par exemple, si nous devons trouver les informations de base des étudiants qui ont échoué à l'examen, nous devons d'abord interroger l'identifiant des étudiants qui ont échoué à l'examen à partir du tableau des scores, puis interroger les données d'informations de base à partir des informations de base. tableau des élèves :

select cname,age,gender from student where id in (select stu_id from score where score<60)

Bien que l'utilisation de sous-requêtes puisse effectuer de nombreuses opérations SQL nécessitant logiquement plusieurs étapes à la fois, elle peut également éviter les verrous de transaction ou de table, et elle est facile à écrire. Cependant, l'instruction écrite de cette manière est très détaillée et l'efficacité de la requête est relativement lente. Ainsi, dans certains cas, la sous-requête peut être remplacée par une jointure plus efficace. Par exemple, l'instruction de requête ci-dessus peut être écrite comme ceci

select cname,age,gender from student s left join score c on s.id=c.stu_id where c.score<60

La raison pour laquelle l'utilisation de la jointure 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 qui nécessite deux étapes.

4. Affaires

Nous savons que dans de nombreux cas, certaines opérations sur la base de données ne peuvent pas être effectuées avec une seule ou quelques instructions SQL. Le plus souvent, il est nécessaire d'utiliser une série d'instructions pour effectuer une sorte de travail. Mais dans ce cas, lorsqu'une certaine instruction dans le bloc d'instructions s'exécute de manière incorrecte, le fonctionnement de l'ensemble du bloc d'instructions devient incertain. Un exemple très classique, un virement bancaire doit être débité d'un compte et déposé sur un compte. Si un compte a a été débité avec succès, une situation inattendue se produit à ce moment, ou l'exécution de la déclaration suivante est erronée, et le le compte b n'est pas déposé. A ce moment, la cohérence des données est détruite, et elle n'est pas conforme à l'atomicité. Vous devez donc utiliser les transactions pour le moment. Pour les transactions, veuillez vous référer à l'article précédent : niveau d'isolement des transactions .

Les choses commencent par le mot-clé BEGIN et se terminent par le mot-clé COMMIT. Si une opération SQL échoue entre-temps, la commande ROLLBACK peut restaurer la base de données à l'état avant le démarrage de BEGIN. Par exemple

BEGIN;
  INSERT INTO student SET cname='江夏';
  UPDATE score set score=99 where id=20
COMMIT;

Une autre fonction importante des transactions est que lorsque plusieurs utilisateurs utilisent la même source de données en même temps, cela peut fournir aux utilisateurs une méthode d'accès sécurisée en verrouillant la base de données, ce qui peut garantir que les opérations de l'utilisateur ne seront pas gênées par d'autres utilisateurs.

5. Utiliser des clés étrangères

Parfois, des clés étrangères peuvent être utilisées pour assurer l'association des données.

Par exemple, l'utilisation d'une clé étrangère dans le tableau des scores peut garantir que chaque enregistrement de score pointe vers un étudiant correspondant. Ici, la clé étrangère peut mapper le sty_id dans la table des scores à l'id dans la table des étudiants, de sorte que tout enregistrement sans stu_id valide ne sera pas mis à jour ou inséré dans le score.

La syntaxe de la clé étrangère est la suivante :

具体的语法格式如下:
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]

Pour deux tables avec une relation d'association, la table où se trouve la clé primaire dans le champ associé est la table principale (table parent) et la table où se trouve la clé étrangère est la table secondaire (table enfant).

Lors de la définition des clés étrangères, les règles suivantes doivent être suivies :

1. La table principale doit déjà exister dans la base de données ou être une table en cours de création. Dans ce dernier cas, la table maître et la table esclave sont la même table, une telle table est appelée table auto-référentielle, et cette structure est appelée intégrité auto-référentielle. Une clé primaire doit être définie pour la table principale.

2. La clé primaire ne peut pas contenir de valeurs nulles, mais les valeurs nulles sont autorisées dans les clés étrangères. Autrement dit, le contenu de la clé étrangère est correct tant que chaque valeur non nulle de la clé étrangère apparaît dans la clé primaire spécifiée.

3. Spécifiez le nom de colonne ou une combinaison de noms de colonne après le nom de table de la table principale. Cette colonne ou combinaison de colonnes doit être la clé primaire ou la clé candidate de la table primaire.

4. Le nombre de colonnes dans la clé étrangère doit être le même que le nombre de colonnes dans la clé primaire de la table principale.

5. Le type de données de la colonne dans la clé étrangère doit être le même que le type de données de la colonne correspondante dans la clé primaire de la table principale.

6. Utilisez des index

L'indexation est un moyen courant d'améliorer les performances de la base de données. Elle permet au serveur de base de données de récupérer des lignes spécifiques beaucoup plus rapidement que sans index, en particulier lorsque l'instruction de requête contient des commandes telles que MAX(), MIN() et ORDERBY. L'amélioration des performances est encore plus prononcé.

Quels champs doivent être indexés ?

De manière générale, les index doivent être construits sur les champs qui seront utilisés pour le tri JOIN, WHERE et ORDERBY. Essayez de ne pas indexer un champ de la base de données qui contient un grand nombre de valeurs en double. Pour un champ de type ENUM, il est très probable qu'il y ait un grand nombre de valeurs en double

Par exemple, l'indexation du champ "sexe" dans la table des utilisateurs n'aidera pas et peut réduire les performances de la base de données. Lors de la création d'une table, vous pouvez créer un index approprié en même temps, ou vous pouvez utiliser ALTER TABLE ou CREATE INDEX pour créer un index ultérieurement. De plus, MySQL prend en charge l'indexation et la recherche de texte intégral à partir de la version 3.23.23. Un index de texte intégral est un index de type FULLTEXT dans MySQL, mais il ne peut être utilisé que pour les tables de type MyISAM. Pour une grande base de données, il est très rapide de charger des données dans une table sans index FULLTEXT, puis d'utiliser ALTER TABLE ou CREATE INDEX pour créer l'index. Mais si les données sont chargées dans une table qui a déjà un index FULLTEXT, le processus d'exécution sera très lent.

Pour une certaine utilisation des index, vous pouvez vous référer à l'article précédent : Plusieurs compétences d'optimisation SQL qu'il faut maîtriser (7) : Le meilleur usage des index ; vous ne savez toujours pas ce qu'est un index de base de données .

7. Verrouiller le tableau

Étant donné que la base de données sera verrouillée pendant l'exécution de la transaction, les autres requêtes des utilisateurs ne peuvent attendre que temporairement jusqu'à la fin de la transaction. Dans certains cas, nous pouvons obtenir de meilleures performances en augmentant la taille de la table verrouillée.

Un verrou est un drapeau associé à une table. MySQL permet aux sessions client d'acquérir explicitement des verrous de table pour empêcher d'autres sessions d'accéder à la même table pendant une période de temps spécifique. Une session client ne peut acquérir ou libérer des verrous de table que pour elle-même. Il ne peut pas acquérir ou libérer les verrous de table d'autres sessions.

L'instruction suivante acquiert explicitement un verrou de table :

LOCK TABLES table_name [READ | WRITE]

Pour verrouiller une table, spécifiez son nom après le mot clé LOCK TABLES. De plus, vous pouvez également spécifier le type de verrou, qui peut être READ ou WRITE.

Pour libérer un verrou sur une table, utilisez l'instruction suivante :

UNLOCK TABLES;

Résumer

Ce qui précède sont quelques points sur mysql dans l'optimisation de la base de données. L'optimisation de la base de données n'est pas seulement un point de connaissance fréquemment demandé dans les entretiens écrits, mais aussi souvent utilisé dans le développement et l'application réels. S'il y a quelque chose qui ne va pas, discutez-en et corrigez-moi ! Et s'il existe d'autres meilleures méthodes ou lieux non mentionnés dans cet article, bienvenue pour échanger et discuter !

suggestion connexe

おすすめ

転載: blog.csdn.net/qq_41153943/article/details/125570444