Apprenez à connaître la structure de données d'index de base de données MySQL qui n'est plus da suffisant Meng Meng

Comme gras, multi-points est aussi grande production! Microcanaux recherche numéro public [ stylo Damocles ] pour plusressources, fixé à l'extrémité du codedeux dimensions!
Adresse github: https: //github.com/stt0626/JavaGreatcontinué de mettre à jour les informations incluses

avant-propos

  En ce qui concerne l' optimisation de la base de données blurt est d'ajouter l'index, sinon avec le lieu et l' index de base de données « déverrouiller la base de données de la série » est prêt pour vous! Si vous êtes comme moi, je ne compris les structures de données sous - jacentes, les index de base de données, ignorants X X arbres fruitiers ignorant, ignorant X sous un arbre pour vous et moi, s'il vous plaît laissez un message pour me dire plus que moi, et mon sentiment de coeur mieux au fond, mais maintenant je une compréhension approfondie, lire l'article en entier , je crois que vous et moi, comme le brouillard le jour avec un sourire: 就这? Car il est cela, il ne parlait pas beaucoup départ immédiat!

Index structure de données

  index de base de données sont principalement des tables de hachage, les arbres binaires, arbre rouge-noir, arbre B, arbre B +, nous MySQL utilise un arbre B +!

Indice de Hash

introduction

  index de hachage (index de hachage) sur la base d'une mise en oeuvre de la table de hachage, pour chaque rangée de données, un moteur de stockage sont calculés par un code de hachage de toutes les colonnes indexées (code de hachage), le code de hachage est une petite valeur, tous les index de hachage code de hachage est stocké dans l'index, tout en conservant un pointeur vers chaque ligne de données dans une table de hachage. Si vous allez utiliser le même code de hachage est stocké sous la forme d'une liste chaînée, similaire à HashMap, l'indice de Hash convient pour les requêtes précises.

par exemple

  Le tableau ci - dessous il ,
Insérer ici l'image Description
  si on construit l'index dans la colonne de nom, le nom de la base de données calcule la valeur de hachage de la colonne de nom de chaque ligne de données en utilisant un algorithme de hachage et stocké. les valeurs de hachage sont calculées aléatoire, donc il peut y avoir un conflit, si le résultat du calcul en tant que
Insérer ici l'image Description
  structure de données d'index de hachage suivante
Insérer ici l'image Description

Nous avons un SELECT id, nom, âge DE t_user WHERE nom = « petite pierre Tim »; Un tel SQL directement à 石小添une valeur de hachage en hachant calculée, pour trouver le pointeur d'enregistrement correspondant par cette valeur, le pointeur d'enregistrement trouvé dans le tableau dont la ligne de données, en comparant le nom de famille que ce soit une petite pierre à ajouter à assurer que la ligne se trouve.
Mais si nous avons SELECT id, nom, âge t_user DE WHERE nom> « pour ajouter petite pierre », un tel SQL sont impuissants, car la table de hachage 支持快速的精确查询,但是不支持范围查询.

Résumé de l'index Hash

  • index de hachage ne contient que le pointeur de rangée et une valeur de hachage, sans stocker la valeur du champ, la valeur de l'index ne peut pas être utilisé pour éviter la ligne de lecture
  • les données d'index de hachage ne sont pas stockées dans l'ordre en fonction de la valeur d'index, de sorte qu'il ne peut pas être utilisé pour le tri
  • partie d'index de hachage de la colonne indexée ne prend pas en charge les recherches de match, car l'index de hachage est toujours à utiliser toutes les colonnes indexées de contenu pour calculer une valeur de hachage
  • L'index de hachage ne supporte que l'équivalent de la comparaison d'une requête, la requête ne prend pas toute gamme
  • données d'index de hachage d'accès très rapidement, à moins que des conflits Duoha Xi (différentes valeurs de la colonne d'index il y a la même valeur de hachage). Lorsque la collision de hachage se produit, le moteur de stockage doit parcourir la totalité du pointeur ligne liée liste, ligne par comparaison de la ligne, jusqu'à ce que vous trouverez toutes les lignes admissibles
  • Si le conflit de hachage de mots, une partie du coût des opérations d'entretien de l'indice sera élevé. Par exemple, si une faible sélectivité (plusieurs collisions de hachage) dans la colonne d'établir un index de hachage, lorsque vous supprimez une ligne de la table, les besoins du moteur de stockage à travers chaque ligne de la liste correspond à la valeur de hachage et de trouver supprimer la ligne de référence correspondant, plus le conflit, plus le coût

Binary Tree

  Binary Tree (arbre binaire) chaque nœud a au plus deux structure arborescente sous-arbres. Généralement sous-arbre appelé « sous-arbre gauche » (sous-arbre gauche), et « sous-arbre droit » (sous-arbre à droite). arbre binaire est souvent utilisé pour mettre en œuvre un arbre de recherche binaire et un tas binaire.
Insérer ici l'image Description

par exemple

Insérer ici l'image Description

colonnes id add pour stocker les index d'arbres binaires, comme indiqué ci-dessous

Insérer ici l'image Description

Si nos données est la croissance unilatérale pourrait éventuellement devenir une liste d'arbre binaire, on interroge les données dans la figure suivante

Insérer ici l'image Description

S'il y a un SQL SELECT id,name,age FROM tb_user WHERE id=7, créer un index pour ce champ et que vous utilisez un arbre binaire pour maintenir son allure pour six fois, et la vitesse pour créer l'index n'est pas le même!
Binary Tree index dans le champ d'index est une scène continue est faible ou lorsque d' autres propriétés, et cet arbre est fortement biaisé déséquilibre, ce qui conduit nous红黑树

Binary Tree Caractéristiques

  • Si le sous-arbre gauche n'est pas vide, la valeur de la sous-arborescence à gauche, tous les nœuds sont inférieurs à la valeur du nœud racine;
  • Si cela est sous-arbre droit de nœuds qui sont supérieurs à la valeur du nœud racine;
  • Ses sous-arbres gauche et à droite sont également arbre de tri binaire

arbre rouge-noir

  arbre rouge-noir (arbre noir rouge) est un nœud et peut contenir l'auto-équilibrage rouge et noir arbre de recherche binaire est un arbre binaire équilibré. Chaque nœud stocke un arbre rouge-noir a des nœuds de couleur, peut être rouge (rouge) ou noir (noir)

Même, les colonnes id ajouter un index à l'aide d'un arbre rouge-noir est stocké, comme indiqué ci-dessous, nous trouverons fera un ajustement afin que l'arbre est relativement équilibré, à faible valeur placée sur PUT noeuds supérieur gauche de plus grande valeur sur le nœud parent droit

Insérer ici l'image Description

La même chose que de trouver deux données 4 et 7, comme sur la figure.

Insérer ici l'image Description

Après il est clair que nous utilisons arbre rouge-noir par rapport à un arbre binaire, cet arbre est plus équilibré, la recherche de données plus rapide, encore MySQL ne pas la structure de données pour maintenir les données d'index est pourquoi? Ci-dessous pour analyser en profondeur boutonné

faute professionnelle arbre rouge-noir

  • À l'heure actuelle, il y a six tables de données, il est donc nécessaire d'utiliser ces six stockés entretien des arbres rouge-noir, la hauteur de l'arbre h = 4, respectivement, 2,4,6,7 quatre nœuds, il n'y a pas de problème, droit
  • Les données que nous avons en fait impossible que quelques articles sont un million, dix millions de données, l'arbre rouge-noir si vous voulez maintenir un million, dix millions de données, qui peut être l'arbre rouge-noir de hauteur h =? De bons calculs, si nous voulons des morceaux de données stockées dans une table 100W, 100W il y a un noeuds rouge et noir, chaque nœud a deux branches, l'arbre entier complet 2 ^ n = 1000000, n h est la profondeur, faire le droit de mathématiques
  • En analysant le haut, nous avons constaté que l'utilisation des données d'index entretien des arbres rouge-noir, cet arbre trop profond, trop profond pour ~~~
  • Si les données que vous recherchez à un noeud de feuille, puis le nombre de requêtes trouvent également de nombreux

Plus fois, nous pouvons trouver des données sur le dessus de l'arbre rouge-noir par la majorité de la hauteur de la plus élevée, plus les données de requête d'arbres nécessaires, nous contrôlons la hauteur de l'arbre, vous pouvez contrôler le nombre de requêtes, ceci est notre arbre B Albert pour terminer, vous voudrez peut-être une tasse de thé, pensez à la hauteur de la base de l'arbre sur la couche de contrôle de l'arbre rouge-noir 3-5, puis les données sont stockées dix millions, si vous voulez comment?

B-tree

  arbre rouge-noir est un arbre binaire et des données de noeud de stockage, et B est le nombre de noeuds sur un magasin plus de données sur la base de l' arbre rouge-noir, les soi-disant BTree, BTree, arbres B qui sont la même chose , le nom complet Balance-treetraduit 平衡多路查找树, 平衡uniformément distribué à gauche et à droite. · 多路En ce qui concerne un arbre binaire, l'arbre de recherche binaire est bidirectionnel, lorsque vous cherchez seulement deux, alors que les multiples B-tree itinéraires qui ont nœud parent plusieurs enfants, plug-parler
Insérer ici l'image Description

Oh, c'est

Insérer ici l'image Description

  • Est un noeud de sommet 18,25,60, 20 et 23 est un noeud, stocke la pluralité de données sur le même nœud
  • les données sont les données stockées sur ce nœud, si MySQL est utilisé dans les données B-tree est stocké dans l'adresse de disque est l'emplacement des données de la ligne que nous recherchons sur le disque
  • Retour à l'index pour trouver le noeud correspondant, trouver les données correspondantes dans le noeud, puis obtenir l'adresse du disque se trouve sur des données en ligne

Voir stockage de données B-arbre, après le dépôt et un total de quatre noeuds, un noeud 2,4 de stockage, un noeud 1, un noeud 3, un noeud 6, 7, 1 1 à 2 heures pour que la partie gauche 2, 3 2 majorité de 4 heures, de sorte que la partie droite de la partie gauche 2 4, 2, 4 dans le même noeud de stockage, 6,7 grand que 4, il est stocké sur un côté droit du noeud 4

Insérer ici l'image Description

Jetez un oeil à la B-tree, la première fois que nous prenons les données directement au nœud racine 4, 7 pour prendre la deuxième, pour déterminer où trouver les deux nœuds

Insérer ici l'image Description

B-Tree Caractéristiques

  • B-Tree peut réduire de manière significative l'histoire de l'emplacement intermédiaire connu au cours du processus, de sorte que l'accès plus rapide. Cette structure de données est généralement utilisé la base de données de l'indice, l'efficacité globale supérieure
  • Dents jeu de clés répartis dans l'arbre, tout un mot-clé apparaît une fois seulement à un point de jonction
  • nœud de données de gauche à droite commande
  • Il y a la recherche peut se terminer par un nœud non-feuille, 叶子结点est le degré de nœud est 0没有子结点的结点
  • Rechercher séquence de noeuds dans la recherche binaire, si le coup est terminé, sinon passez au nœud fils appartient à la portée des mots-clés de la requête B- racine depuis le début, mot-clé arbre (ordonnée), répétée jusqu'à ce que le correspondant pointeur fils est nulle, ou est déjà un nœud feuille

B + Arbre

  B + Tree est une des variantes B-Tree, MySQL B + Tree est utilisé comme la structure de données d'index, la figure.
Insérer ici l'image Description

  • nœuds non-feuille ne stockent pas de données
  • le noeud redondant, des noeuds feuilles contiennent tous les noeuds non-feuille
  • Les données stockées dans les nœuds feuilles, et les nœuds feuilles il entre les points de flèche

B + Arbre données stockées

Insérer ici l'image Description

B + arbre de chargement

Insérer ici l'image Description

B + Arbre Pourquoi les nœuds feuilles stocker des données de manière redondante

et les besoins de nœuds de stockage de données d' espace, si les données sont supprimées, peut sauver plusieurs noeuds, MySQL utilisé dans chaque nœud B + arbre peut contenir jusqu'à 16 Ko de données peut SHOW GLOBAL STATUS LIKE 'InnoDb_page_size';interroger le SQL cela, dans le cas de 16Ko MySQL使用B+Tree可以存储更多的索引元素, si Table id bigint utilisée comme un index représentant 8Byte, tout en utilisant l'enregistrement 6Byte noeud enfant alors un champ d'index de positions représentant 8 + 6 = 14Byte, 16KB / 14Byte = 1170, chaque noeud peut stocker des éléments 1170
Insérer ici l'image Description

B + Tree est plein la quantité de données peuvent être stockées

Nous avons calculé en haut de chaque noeud peut stocker 1170 éléments, chaque nœud dispose également d' un nœud enfant, si la hauteur de l' arbre 3 chaque compte d'index pour la taille de 1 Ko, 1 Ko Ce n'est plus petit, il peut stocker des 1170*1170*16=2190Wmorceaux de données, nous rencontrons pleinement requêtes millions de tables de données de niveau

B + arbre noeud feuille fait couper les cheveux

B + nœud non-feuille dans un noeud de feuille d'arbre redondant, et relié avec des pointeurs entre les noeuds de feuille, au début de hachage ne supporte pas les requêtes de portée, la hauteur d'arbre binaire est élevé, seul arbre B B + avec quelqu'un , le noeud de l'arbre B peut stocker une pluralité d'éléments, par rapport à la hauteur de l'arbre entier arbre rouge-noir est réduite, l'efficacité est améliorée disque IO. Le B + arbre est une version améliorée du B-arbre, il suffit de regarder à la redondance des nœuds non-feuille, avantage est d'améliorer la gamme d'efficacité de la recherche. La raison de l'augmentation est plus qu'un nœud feuille ont un pointeur vers le noeud suivant

B + Arbre Caractéristiques

  • Tous les mots clés apparaissent dans le nœud feuille de liste (index dense), et la liste des mots-clés viens juste de commander
  • Dans l'arborescence B, sur la base pointeur de la liste accrue est un nœud feuille, tous les mots clés apparaissent dans un nœud feuille, les noeuds non-feuilles comme un nœud de feuille d'index;
  • B + arbre à un nœud feuille est toujours seulement des données touchées ne peuvent pas être frappé dans les noeuds non-feuilles
  • Plus approprié pour le système d'indexation de documents
  • Plus simples éléments de stockage de noeud, de sorte que le nombre de requêtes IO moins, il est donc plus approprié que la structure de données sous-jacentes de la base de données MySQL

Pour que nous avons introduit Hash, arbre binaire, arbre rouge-noir, B-Tree, arbre B + pour chaque structure de données, et a conclu que l'utilisation Mysql B + arbre comme un disque efficacité IO lors du maintien de la structure de données de l'indice, l'indice peut améliorer requête et peut améliorer l'efficacité des requêtes de gamme, et les éléments d'arbre B + est en ordre, nous allons parler de deux moteurs de stockage de mysql commun comment utiliser l'index spécifique

index du moteur de stockage MyISAM pour atteindre

Créer une table dernière ligne MOTEUR = MyISAM

CREATE TABLE `tb_myisam` (
  `id` int(11) NOT NULL,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Stockage sur disque

Insérer ici l'image Description

Après une table MyISAM va créer trois fichiers sur le disque frm, MYD, MYIentretien
FRM: structure de la table de stockage
MYD: le stockage des données de table
MYI: index de la table de stockage

Ajout de données

insert into tb_myisam (id,col1,col2) VALUES
(2,"测试数据2","测试数据22"),
(4,"测试数据4","测试数据44"),
(5,"测试数据5","测试数据55"),
(7,"测试数据7","测试数据77"),
(1,"测试数据1","测试数据11"),
(3,"测试数据3","测试数据33"),
(6,"测试数据6","测试数据66");

Voir les données

SELECT id,col1,col2 FROM tb_myisam

Insérer ici l'image Description

Peut voir les données triées dans l'ordre de tri par insertion

entretien MyISAM

Créée dans l'index de colonne d'identité, les données maintenues dans le coin supérieur gauche de la structure B + Arbre, en bas à droite des données du tableau de données, B + noeuds de feuille d' arbre en dessous du point de stockage de données est l'adresse de rangée correspondant au disque de données, en ajoutant il y a une SELECT id FROM tb_myisam WHERE id=3volonté première dans le fichier d'index pour trouver le noeud 3, puis retirez les correspond d'adresse de disque fichier MYD, recherchez ces données en ligne pour la requête.

Insérer ici l'image Description

moteur de stockage InnoDB pour atteindre l'indice

Créer une table

CREATE TABLE `tb_innodb` (
  `id` int(11) NOT NULL,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Stockage sur disque

Insérer ici l'image Description

Après une table InnoDB va créer deux fichiers sur le disque frm, la ibdmaintenance
FRM: structure de la table de stockage
IBD: table de stockage et des données d'index

Ajout de données

insert into tb_innodb (id,col1,col2) VALUES
(2,"测试数据2","测试数据22"),
(4,"测试数据4","测试数据44"),
(5,"测试数据5","测试数据55"),
(7,"测试数据7","测试数据77"),
(1,"测试数据1","测试数据11"),
(3,"测试数据3","测试数据33"),
(6,"测试数据6","测试数据66");

interrogation des données

Insérer ici l'image Description

MySQL crée automatiquement un index de clé primaire, moteur de recherche InnoDB commandée par la clé primaire

la maintenance des index InnoDB

moteur de stockage InnoDB, table fichier de données est un fichier IBD lui-même est conforme à la structure du fichier d'index B + organisation d'arbre, nœud feuille contient un enregistrement de données complète
Insérer ici l'image Description

S'il n'y a pas d'index que nous ne InnoDB, les données ne sont pas stockées encore?

  Nous devons imposer une peine InnoDB doit avoir une clé primaire et la clé primaire est recommandé entier utilisation incrémentation automatique, si vous table a une clé primaire qui ajoutera un index sur la clé primaire pour maintenir, ne spécifiez pas la clé primaire si vous créez une table, la base de données votre table pour constater que la seule colonne de données pour maintenir, si pas trouver une telle colonne, la base de données par défaut augmentera sa propre à maintenir un.
  La première raison est recommandé d'utiliser entier entier empreinte de stockage plus petit et plus rapide comparaison de tri, certaines entreprises peuvent utiliser UUID comme clé primaire, etc., UUID est une chaîne aléatoire, vous devez convertir dans la comparaison, puis comparer et occupation un grand espace, il est recommandé de ne pas utiliser
  l'auto-incrément recommandé parce que nous les données de nœud feuille de gauche à droite en ordre croissant, plus pratique lorsque vous effectuez des requêtes de gamme, si votre valeur est aléatoire , il est possible de modifier la structure de l' arbre d' origine, conduire à une scission, scission affectent les performances, vous pouvez voir la figure, par exemple, nous avons enfin à voir des changements ajouter 8
Insérer ici l'image Description

look indice commun comme?

  Nous ne créons pas généralement un indice distinct dans le développement du projet, mais plusieurs création d'index commune clé, et maintenant aussi longtemps que vous comprenez l'ensemble indice commun principe sous-jacent, le principe de l'optimisation des index MySQL en ligne pour voir qui vous pouvez aller à comprendre les principes sous-jacents plutôt que revenir en arrière, je suis très méchant les choses, back-end oublier bientôt ennuyeux, ci-dessous est l'indice commun des regards
Insérer ici l'image Description

Supposons indice combiné (col1, col2, col3), trois lignes de données dans les carrés verts sont pour la. Figure, selon Respectivement col1, col2, col3 trois tri, pourpre autres champs non indexées, où le joint doit être entendu l'indice est selon quel type de 最左前缀法则, 为什么索引会失效comme ainsi les exigences de réglage d'index en ligne Pourquoi êtes - vous si des articles d'écriture, je veux passer par votre pensée devrait tout comprendre! Assurez - vous de réfléchir!

Article Idées

"High Performance MySQL"
"MySQL Inside: moteur de stockage InnoDB".

Venez spectateurs une petite idée réelle

tout ce que je suis d' abord les lecteurs reconnaissants préoccupés 本工具人pensées, je vous remercie préoccupé par moi 抹眼泪, ou le laisser est 好奇, je vous remercie 关注et 点赞. La seconde est quelques idées, cet article vraiment passé beaucoup de temps et d' énergie, le principe sous - jacent de la chose plus la recherche se trouvent mal compris, afin d'écrire cet article afin que nous comprenions cela est ajouté au premier article dans un film , carte mobile rendant le logiciel a un point d'effort, le temps d' apprendre à lire ne veut pas dire nous avons aussi appris une chose se Haha, avant d'écrire un blog sont dans mon blog sur l'utilisation de la technologie, parce que je pense la technologie peut être blanc d'entrée maître avancé guichet unique, mais trouver à l' énergie est limitée, et la technologie est mise en route peut être trouvé en ligne partout, mais nous aimerions voir certaines d' entre elles devraient aussi 原理层, les 思想层aspects de l'article de se mettre à jour 进入大厂收割Offer, non seulement rester dans la phase initiale, nous avons besoin de croître rapidement, de sorte que le dos de l'article porte sur l' écriture 原理层, 思想层, 产品, 学习路线et d' autres aspects de l'article, vous pouvez voir la série de cours d'apprentissage entrée blanc d'articles, travail 1--3 d'amis peut regarder au niveau des principes, l' idéologie, l' article de l' architecture, 5 ans ou que vos amis puissent voir le produit, savoir comment concevoir un bon produit de bonne macro, capacité limitée à moi avancée La haine ne vient pas 好羞耻sur, .

L'écriture est pas facile, le mot de code dur, des étourdissements et parfois écrit vraiment aucune idée, mais a été et nous espérons aider un ami comme [**] ** pas putain blanche, rappelez-vous pouces vers le haut, au-dessous il y a un problème ou concernent des commentaires publics ajoutant micro signaux amis, amis QQ, etc. pour explorer les uns des autres et de grandir ensemble ne sont plus debout encore confus, non plus par ses collègues à la friction au sol, d'autres ne sont plus admire, tandis que d'autres deviennent le centre

Nous sommes ici pour préparer le matériel d' apprentissage, des liens directs seront affichés opérateurs de blog remarquer petite soeur, veulent être vieux paysage de fer du nombre de préoccupations du public, [répondre 资料] à!

De plus les lignes de celui-ci, deux images ensemble trop brusque, scannez le prochain numéro de code Fanger Wei de l'attention du public, l'accès aux ressources réponse [informations]

résumé

Benpian N expliquer la structure de données, index MySQL principes sous - jacents, le poisson salé prêt à convertir cette direction de mise à jour du blog 世间唯一不变的便是变化, Thaksin est meilleure confiance en soi, apprendre ensemble se leva de l'autre côté du salé
route est longue Venez, le bonheur et la terre

Publié 27 articles originaux · louange gagné 148 · vues 10000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_36386908/article/details/104730786
conseillé
Classement