Un article pour analyser les trois principaux points de connaissance de MySql-index, lock, transaction

1. Index

Les index, comme les catalogues de livres, peuvent trouver le contenu correspondant immédiatement en fonction d'un certain numéro de page du catalogue.

Les avantages de l'indexation: 1. Tri naturel. 2. Recherche rapide .

Inconvénients de l'index: 1. Prenez de la place. 2. Réduisez la vitesse de mise à jour de la table .

注意点:小表使用全表扫描更快,中大表才使用索引。超级大表索引基本无效

En termes d'implémentation, les index sont divisés en deux types: les index clusterisés et les index auxiliaires (également appelés index secondaires ou index non clusterisés)

D'un point de vue fonctionnel, il est divisé en 6 types: index ordinaire, index unique, index de clé primaire, index composite, index de clé étrangère, index de texte intégral.

Parlez de 6 index en détail :

1. Indice ordinaire: l'indice le plus élémentaire, sans aucune contrainte.

2. Index unique: similaire à l'index ordinaire, mais avec des contraintes uniques.

3. Index de clé primaire: un index unique spécial qui n'autorise pas les valeurs nulles .

4. Index composé: combinez plusieurs colonnes pour créer un index, qui peut couvrir plusieurs colonnes.

5. Index de clé étrangère: seules les tables de type InnoDB peuvent utiliser des index de clé étrangère pour garantir la cohérence, l'intégrité et les opérations en cascade des données.

6. Index de texte intégral: L'index de texte intégral fourni avec MySQL ne peut être utilisé que pour InnoDB, MyISAM et ne peut effectuer une recherche de texte intégral qu'en anglais. En général, les moteurs d'indexation de texte intégral (ES, Solr) sont utilisés.

  • 注意:主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空。

De plus, InnoDB regroupe les données par clé primaire. Si la clé primaire n'est pas définie et que l'index cluster n'est pas défini, MySql sélectionnera à la place un index unique non nul. S'il n'y en a pas, une clé primaire de 6 octets sera implicitement définie comme l'index clusterisé , Les utilisateurs ne peuvent pas afficher ou accéder.

Autrement dit:

  1. Lors de la définition de la clé primaire, un index unique est généré automatiquement. S'il n'y a pas d'index cluster auparavant , la clé primaire est l'index cluster.
  2. Lorsque la clé primaire n'est pas définie, un index unique non nul sera sélectionné comme index clusterisé. Si ce n'est pas déjà fait, un index implicite de 6 octets sera généré.

MySql stocke les données en fonction des pages. La page par défaut est de 16 Ko. Lorsque vous effectuez une requête, vous chargez non seulement une certaine donnée, mais également toutes les pages où ces données se trouvent dans pageCache. Il s'agit en fait du principe d'accès au système d'exploitation. Similaire.

L'index MySql utilise une structure arborescente B +. Avant de parler de l'arbre B +, parlons de l'arbre B. L'arbre B est un arbre de recherche équilibré multidirectionnel. Comparé à l'arbre binaire ordinaire, il ne sera pas extrêmement déséquilibré et il est également multidirectionnel.

La caractéristique de B-tree est qu'il enregistrera également les données dans des sous-nœuds non-page.

Vous pouvez voir sur l'image:

Cette fonctionnalité peut entraîner le stockage d'un grand nombre d'index par les nœuds enfants non-page.

L'arbre B + est optimisé pour cela. Comme indiqué ci-dessous:

Nous voyons que B + Tree enregistre toutes les données de données dans les nœuds feuilles et que les nœuds non enfants n'enregistrent que les index et les pointeurs.

Nous supposons qu'un nœud enfant non-page fait 16 Ko et que chaque index, c'est-à-dire la clé primaire est bigint, c'est-à-dire 8b, et le pointeur est 8b. Ensuite, chaque page peut stocker environ 1000 index (16kb / 8b + 8b).

Et combien d'index une arborescence B + 3 couches peut-elle stocker? Comme indiqué ci-dessous:

Environ 1 milliard d'index peuvent être stockés. Habituellement, la hauteur de l'arborescence B + est comprise entre 2 et 4. Comme MySql est en cours d'exécution, le nœud racine réside en mémoire, donc chaque recherche n'a besoin que de 2 à 3 entrées / sorties. On peut dire que la conception de l'arbre B + est basée sur les caractéristiques du disque mécanique.

Connaissant la conception de l'index, nous pouvons connaître quelques informations supplémentaires:

  1. La clé primaire de MySql ne peut pas être trop grande. Si UUID est utilisé, il gâchera les nœuds non-feuilles de l'arborescence B +.
  2. La clé primaire de MySql est de préférence auto-incrémentée. Si vous utilisez UUID, l'arborescence B + sera ajustée à chaque fois que vous insérez, ce qui provoquera un fractionnement de page et affectera sérieusement les performances.

Donc, si une sous-base de données et une sous-table sont utilisées dans le projet, nous avons généralement besoin d'une clé primaire pour le partage, que devons-nous faire? Dans l'implémentation, nous pouvons conserver la clé primaire auto-incrémentée et la clé primaire logique peut être utilisée comme un index unique.

Deuxièmement, le mécanisme de verrouillage

En ce qui concerne les verrous Mysql, divers concepts vont éclater. En fait, les verrous ont plusieurs dimensions, expliquons.

1. Dimension du type

  • Verrouillage partagé (verrou de lecture / verrou S)

  • Verrouillage exclusif (verrouillage en écriture / verrouillage X)

    Répartition du type:

    • Verrouillage partagé intentionnel
    • Verrouillage exclusif intentionnel (mutuellement exclusif)
  • Verrous pessimistes (à l'aide de verrous, par exemple pour la mise à jour)

  • Verrouillage optimiste (en utilisant le champ du numéro de version, similaire au mécanisme CAS, c'est-à-dire que l'utilisateur le contrôle. Inconvénients: lorsque la concurrence est élevée, il existe de nombreuses tentatives inutiles)

2. La granularité de la serrure (dimension de granularité)

  • Serrure de table
  • Verrouillage de page (moteur Mysql BerkeleyDB)
  • Verrou de ligne (InnoDB)

3. L'algorithme de verrouillage (dimension de l'algorithme)

  • Verrouillage d'enregistrement (enregistrement sur une seule ligne)
  • Gap Lock (verrouillage d'espace, verrouillage d'une plage, mais n'inclut pas les enregistrements verrouillés)
  • Next-Key Lock (Record Lock + Gap Lock, verrouille une plage et verrouille l'enregistrement lui-même, MySql empêche la lecture magique, consiste à utiliser ce verrou pour atteindre)

4. L'opération de lecture par défaut est-elle verrouillée?

  • La valeur par défaut est le mécanisme MVCC ("lecture non verrouillée cohérente") pour garantir la précision d'isolement du niveau RR, et il n'est pas verrouillé.

Vous pouvez choisir de verrouiller manuellement: sélectionnez xxxx pour la mise à jour (verrouillage exclusif), sélectionnez le verrouillage xxxx en mode de partage (verrouillage partagé), appelé "lecture cohérente du verrouillage".

Après avoir utilisé le verrou, vous pouvez éviter la lecture fantôme au niveau RR. Bien sûr, la lecture MVCC par défaut peut également éviter la lecture fantôme.

Maintenant que RR peut empêcher la lecture fantôme, à quoi sert SERIALIZABLE?

Empêchez les mises à jour perdues. Par exemple, la figure suivante:

Pour le moment, nous devons utiliser le niveau SERIALISABLE pour la lecture en série.

Enfin, le principe des verrous de ligne est de verrouiller l'index clusterisé. Si vous ne frappez pas correctement l'index lors de la requête, l'optimiseur MySql supprimera les verrous de ligne et utilisera les verrous de table.

3. Affaires

Les transactions sont l'éternel sujet de la base de données, ACID: atomicité, cohérence, isolement, durabilité.

Les quatre caractéristiques les plus importantes sont la cohérence. Et la cohérence est garantie par l'atomicité, l'isolement et la durabilité.

  • L'atomicité est garantie par le journal d'annulation. Undo Log enregistrera l'enregistrement avant chaque modification, afin de revenir en arrière lorsqu'une erreur se produit.
  • L'isolement est garanti par MVCC et Lock. Dites-le plus tard.
  • La persistance est garantie par Redo Log. Chaque fois que les données sont réellement modifiées, l'enregistrement est écrit dans le journal de rétablissement. Ce n'est que lorsque le journal de rétablissement est correctement écrit qu'il sera écrit dans l'arborescence B +. Si l'alimentation est coupée avant la soumission, l'enregistrement peut être restauré via le journal de rétablissement.

Parlez ensuite d'isolement.

Niveau d'isolement :

  1. Lecture non soumise (RU)
  2. Lire soumis (RC)
  3. Lecture répétable (RR)
  4. Sérialisable (sérialisable)

Chaque niveau résoudra différents problèmes, généralement 3 problèmes: lecture sale, lecture non répétable, lecture magique. Une image classique:

Il y a une note ici, concernant la lecture magique, dans la spécification de la base de données, le niveau RR provoquera la lecture magique, mais, en raison de l'optimisation de Mysql, le niveau RR de MySql ne provoquera pas la lecture magique: lors de l'utilisation de la sélection par défaut, MySql utilise le mécanisme MVCC Garanti de ne pas lire la magie; vous pouvez également utiliser des verrous, lorsque vous utilisez des verrous, tels que pour la mise à jour (verrouillage X), le verrouillage en mode de partage (verrouillage S), MySql utilisera Next-Key Lock pour garantir qu'aucune lecture magique ne se produira. La première est appelée lecture instantanée et la seconde est appelée lecture actuelle.

Analyse de principe :

  • Raisons de la lecture incorrecte de la RU: Le principe de la RU est de verrouiller l'enregistrement de ligne de chaque instruction de mise à jour, plutôt que de verrouiller la transaction entière, de sorte qu'une lecture incorrecte se produira. RC et RR verrouillent l'intégralité de la transaction.
  • La raison pour laquelle RC ne peut pas lire de manière répétée: chaque fois que RC exécute une instruction SQL, il génère une nouvelle vue de lecture et chaque lecture est différente. La transaction RR utilise la même vue de lecture du début à la fin.
  • Raisons pour lesquelles RR n'arrive pas à la lecture fantôme: Comme mentionné ci-dessus.

Quelle est la différence entre RR et Serializble? Réponse: la mise à jour est manquante. La section de verrouillage de cet article a déjà été mentionnée.

Introduction MVCC: Contrôle de simultanéité multi-version du nom complet.

InnoDB chaque index cluster a 4 champs cachés, à savoir la clé primaire (RowID), l'ID de transaction récemment modifié (noyau MVCC), le pointeur du journal d'annulation (noyau isolé) et la marque de suppression d'index (une fois supprimé, il ne sera pas supprimé immédiatement) , Mais marquez, puis supprimez de manière asynchrone);

En substance, MVCC est implémenté à l'aide de la liste liée Undo Log.

L'implémentation de MVCC: la transaction modifie les données d'origine dans un verrou exclusif, stocke les données avant modification dans le journal d'annulation et les associe aux données via le pointeur de restauration. Si la modification réussit, rien n'est fait. Si la modification échoue, l'annulation est restaurée. Les données du journal.

Pour dire encore une chose, nous considérons généralement MVCC comme un moyen de verrouillage optimiste, c'est-à-dire en utilisant le numéro de version, mais en fait, innoDB n'est pas implémenté de cette façon. Bien sûr, cela n'affecte pas notre utilisation de MySql.


Progresser ensemble, apprendre et partager

Tout le monde est invité à prêter attention à mon compte public [le vent et les vagues sont calmes et silencieux ], un grand nombre d'articles liés à Java, du matériel d'apprentissage y sera mis à jour et les informations rassemblées y seront également placées.

Si vous pensez qu'il est bon d'écrire, aimez-le et ajoutez de l'attention! Faites attention, ne vous perdez pas, continuez à mettre à jour! ! !

Je suppose que tu aimes

Origine juejin.im/post/5e96b3e3518825737f1a7415
conseillé
Classement