Comment puis-index MySQL de travail?
Je suis vraiment intéressé par la façon dont index MySQL de travail, plus spécifiquement, comment peuvent-ils renvoyer les données demandées sans la numérisation de l'ensemble de la table?
C'est hors-sujet, je sais, mais si quelqu'un pourrait-il m'expliquer cela en détail, je serais très, très reconnaissants.
- dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html
- C'est une très vaste question. Si vous avez un exemple d'une requête qui ne sera pas utiliser un index, et vous ne savez pas pourquoi, vous pouvez le poster et les gens peuvent les aider.
SELECT * FROM members WHERE id = '1'
- alors pourquoi avec l'index, il travaille plus vite? Ce que l'index n'est ici?- Qui ressemble à une requête qui a juste l'air d'un spécifique, enregistrement indexé (peut-être identifié par la clé primaire). L'indice rend encore plus vite car elle est stockée dans la mémoire, le correspondant de la ligne d'index peut être regardé et il contient un pointeur à l'endroit où les données sont stockées. Si MySQL peut aller à l'emplacement exact de la table sans avoir à l'analyse de la table.
- Très bien, merci!
Vous devez vous connecter pour publier un commentaire.
Fondamentalement un index sur une table fonctionne comme un index dans un livre (c'est là que le nom est venu à partir de):
Disons que vous avez un livre sur les bases de données et que vous voulez trouver quelques informations sur le, dire, de stockage. Sans index (en supposant qu'aucun autre aide, comme une table des matières) vous auriez à passer par les pages une par une, jusqu'à ce que vous avez trouvé le sujet (c'est un
full table scan
).D'autre part, un index est une liste de mots-clés, donc, si vous voulez consulter l'index et de voir que
storage
est mentionné sur les pages 113-120,231 et 354. Ensuite, vous pouvez retourner à ces pages directement, sans le chercher (c'est une recherche à l'aide d'un index, un peu plus rapide).Bien sûr, l'utilité de l'index va être dépend de beaucoup de choses - quelques exemples, à l'aide de la comparaison ci-dessus:
La première chose que vous devez savoir est que les index sont un moyen d'éviter la numérisation de l'intégralité de la table pour obtenir le résultat que vous recherchez.
Il existe différents types d'index et ils sont mis en œuvre dans la couche de stockage, donc il n'y a pas de standard entre eux et ils dépendent aussi du moteur de stockage que vous utilisez.
InnoDB et le B+index d'Arborescence
Pour InnoDB, le plus commun type d'index est le B+Arbre en fonction de l'indice, qui stocke les éléments dans un ordre trié. Aussi, vous n'avez pas accès à la "vraie" table pour obtenir les valeurs indexées, ce qui rend votre requête en retour beaucoup plus rapide.
Le "problème" à propos de ce type d'index est que vous avez à la requête de la plus à gauche de la valeur à l'index. Donc, si votre index a deux colonnes, dire le nom et le prénom, l'ordre vous interroger ces champs questions beaucoup.
Donc, d'après le tableau suivant:
Cette requête devrait profiter de l'index:
Mais la suivante ne serait pas
Parce que vous êtes à l'interrogation de la
first_name
colonne premier et ce n'est pas la colonne de gauche de l'index.Ce dernier exemple est encore pire:
Parce que maintenant, vous allez comparer la partie droite de la droite du champ de l'indice.
L'index de hachage
C'est un autre type d'index qui, malheureusement, seule la mémoire backend prend en charge. Il est rapide comme l'éclair, mais seulement utile pour plein de recherches, ce qui signifie que vous ne pouvez pas l'utiliser pour des opérations comme
>
,<
ouLIKE
.Depuis il ne fonctionne que pour la mémoire backend, vous n'aurez probablement pas l'utiliser très souvent. Les principaux cas je pense dès maintenant est celui que vous créez une table temporaire dans la mémoire, avec un ensemble de résultats à partir d'un autre de sélectionner et d'effectuer un grand nombre d'autres sélectionne dans cette table temporaire à l'aide de hachage index.
Si vous avez un gros
VARCHAR
domaine, vous pouvez "imiter" l'utilisation d'un index de hachage lors de l'utilisation d'un B-Arbre, par la création d'une autre colonne et l'enregistrement d'un hachage de la grande valeur. Disons que vous êtes le stockage d'une url dans un champ et les valeurs sont assez grandes. Vous pouvez également créer un champ de type entier appeléurl_hash
et l'utilisation d'une fonction de hachage commeCRC32
ou toute autre fonction de hachage hash de l'url lorsque vous l'insérez. Et puis, quand vous en avez besoin pour la requête de cette valeur, vous pouvez faire quelque chose comme ceci:Le problème avec l'exemple ci-dessus est que, depuis la
CRC32
fonction génère une toute petite table de hachage, vous vous retrouverez avec beaucoup de collisions dans les valeurs de hachage. Si vous avez besoin des valeurs exactes, vous pouvez résoudre ce problème en procédant comme suit:Il est toujours intéressant de hachage des choses, même si le nombre de collision est élevé cause vous n'aurez qu'à effectuer la comparaison (le fil) contre la répétition de hachages.
Malheureusement, en utilisant cette technique, vous avez encore besoin de frapper la table de comparer les
url
champ.Envelopper
Certains faits que vous pourriez envisager, chaque fois que vous voulez parler de l'optimisation:
Comparaison des entiers est plus rapide que la comparaison de chaînes de caractères. Il peut être illustré avec l'exemple sur l'émulation de l'index de hachage dans
InnoDB
.Peut-être, en ajoutant des étapes dans un processus rend plus rapide, pas plus lent. Il peut être illustré par le fait que vous pouvez optimiser une
SELECT
en les divisant en deux étapes, en faisant le premier stocker des valeurs dans une nouvelle table en mémoire, et ensuite exécuter le plus lourd des requêtes sur cette seconde table.MySQL a d'autres indices de trop, mais je pense que le B+Arbre est le plus utilisé jamais et le hachage est une bonne chose à savoir, mais vous pouvez trouver d'autres dans la Documentation de MySQL.
Je vous recommande fortement de lire la "Haute Performance MySQL", le livre, la réponse ci-dessus est certainement basé sur son chapitre sur les index.
SELECT last_name, first_name FROM person WHERE last_name= "Constantine"
2.SELECT last_name, first_name FROM person WHERE last_name LIKE "%Constantine"
utf8mb4
). Si j'avais utilisé l'suggéré de hachage CRC32, je pourrais avoir obtenu des résultats similaires, par la création d'un index sur un champ de type entier (CRC32) de 4 octets au lieu de la 3072 octets par champ que j'utilise maintenant!Fondamentalement un index est une carte de tous vos clés, qui est triée dans l'ordre. Avec une liste dans l'ordre, puis, au lieu de vérifier à chaque touche, il peut faire quelque chose comme ceci:
1: Aller au moyen de la liste est supérieur ou inférieur à ce que je cherche?
2: S'il est supérieur, aller à mi-chemin entre le moyen et le bas, si bas, milieu et haut
3: Est supérieur ou inférieur? Saut à point milieu, etc.
À l'aide de cette logique, vous pouvez trouver un élément dans une liste triée en 7 étapes, au lieu de vérifier chaque élément.
Évidemment il y a des complexités, mais qui vous donne l'idée de base.
Prendre un coup d'oeil à ce lien: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
Comment ils fonctionnent est trop large d'un sujet à couvrir en une SORTE de post.
Ici est l'une des meilleures explications des indices que j'ai vu. Malheureusement, il est pour SQL Server et non MySQL. Je ne suis pas sûr de la façon similaire, les deux sont...
Prendre à cette vidéos pour plus de détails sur l'Indexation
Simple Indexation
Vous pouvez créer un index unique sur la table. Un index unique signifie que les deux lignes ne peuvent pas avoir la même valeur de l'indice. Voici la syntaxe pour créer un Index sur une table
Vous pouvez utiliser une ou plusieurs colonnes pour créer un index. Par exemple, nous pouvons créer un index sur
tutorials_tbl
à l'aide de tutorial_author.Vous pouvez créer un index sur une table. Omettez simplement UNIQUE mot clé de la requête pour créer des index simple. Simple indice permet de doublons dans une table.
Si vous voulez indexer les valeurs dans une colonne dans l'ordre décroissant, vous pouvez ajouter le mot réservé DESC après le nom de la colonne.