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

Était-ce utile?

La solution

Votre index est construit, mais très lentement.

MySQL a deux méthodes pour construire un index:

  1. par le tri. Ceci est la méthode la plus rapide, mais utilise beaucoup de mémoire.
  2. 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

http: //dev.mysql. com / doc / refman / 5.1 / fr / serveur système variables.html # sysvar_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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top