Déterminer l'état d'un index dans une base MySQL
-
27-09-2019 - |
Question
Je créé un nouvel index sur une table avec 35 millions de disques et son été en cours d'exécution pendant près d'1 jour maintenant. Auparavant, quand je crée des index, il a fallu 20 minutes, il y a des colonnes ont été flotteurs cependant. Le nouveau idnex est un varchar (45)
J'utilisé la commande processlist qui montre la création d'index est toujours en cours avec la sortie suivante
65417 | Repair with keycache | CREATE INDEX insert_index on checkins(dateinserted)
Je me demandais si quelqu'un pouvait me donner des conseils sur la recherche de savoir si la requête est en fait mort et il est juste assis dans la liste des processus. Peut-être que quelque chose n'a pas à un moment et je ne suis pas au courant.
Merci
La solution
Votre index est construit, mais très lentement.
MySQL a deux méthodes pour construire un index:
- par le tri. Ceci est la méthode la plus rapide, mais utilise beaucoup de mémoire.
- par keycache. Lent, lent lent, -. Mais utilise peu de mémoire
La méthode keycache est un peu comme genre insertion: les valeurs sont insérées dans l'une des index à la fois. Ceci est la même méthode utilisée par le serveur lorsque l'instruction INSERT permet d'ajouter des lignes à la table.
Le procédé de tri trie les valeurs en utilisant le tri rapide, et construit ensuite l'indice de cela. Il est très rapide, mais nécessite beaucoup de mémoire et d'espace disque temporaire.
Certaines variables du serveur peut augmenter l'espace disponible à la méthode de tri, et ainsi lui permettre de travailler avec des tables plus grandes. Voir myisam_max_sort_file_size
Sur Linux, vous pouvez suivre la progression de la réparation de l'indice en vérifiant la taille des fichiers temporaires qui sont utilisés pour construire l'indice. La commande suivante répertorie tous les fichiers ouverts par le processus de MySQL:
sudo ls -l /proc/[mysql-pid]/fd
Ensuite, vérifiez la taille de ceux avec hash dans leur nom -. Ce sont les fichiers temporaires
Autres conseils
Gardez à l'esprit la taille de l'index sera 35M * 45 au moins. Si c'est une colonne de UTF8 alors il sera 35M * 45 * 3. C'est plus de 4 concerts! Si vous ne disposez pas des tonnes de RAM pour le soutien qu'il va devoir faire beaucoup d'accès disque et vraiment tuer la performance.
Pouvez-vous normaliser cette colonne dans une autre table à?
Sinon, ne les valeurs ont tendance à varier suffisamment en dire les 8 premiers caractères? Vous pourriez être en mesure de sortir avec l'indexation juste 8 d'abord, puis.