8
votes

Créer un index sans verrouiller le dB

J'ai une table avec plus de 10 millions de rangées. Je dois créer un index sur une seule colonne. Toutefois, l'index prend tant de temps pour créer que je reçois des serrures contre la table.

Il est peut-être important de noter que l'index est créé dans le cadre d'une étape «Rake DB: migrer» ... Je ne suis pas défavorable pour créer manuellement l'indice si cela fonctionnera.

mise à jour: je suppose que j'aurais dû mentionner que cela écrit souvent une table.


5 commentaires

Les serrures vont bien. Avez-vous des horaires ou des blocages?


Les serrures ne vont pas bien. C'est la plainte.


Avez-vous déjà trouvé une réponse pour cela?


@Richard, si vous mettez à jour MySQL à une version> 5.1.7 On dirait que vous pouvez créer un index W / O Verrouillage de la DB. Je n'ai pas essayé, j'ai eu la chance de pouvoir planifier une fenêtre de temps courte (lors d'une installation) où je pourrais appliquer les index.


Essayez Facebook OSC ou Percona Toolkit si vous utilisez MySQL. Nous sommes très très heureux avec Percona Toolkit pour les changements de schéma en ligne.


3 Réponses :


2
votes

Vous pouvez empêcher le blocage avec quelque chose comme ceci (pseudo-code): xxx

où l'enregistreur serait tout ce qui ajoute des lignes / mises à jour de votre table en utilisation régulière (ex .: PHP Script ). Cela mettra en place une table temporaire à utiliser pendant que l'autre mises à jour.


1 commentaires

Je suppose que j'aurais dû mentionner que cela écrit souvent une table. Donc, une table tempête sera difficile mais pas impossible à mettre en œuvre. Juste un peu moins qu'idéal.



0
votes

Essayez de vous assurer que l'index est créé avant les enregistrements sont insérés. De cette façon, l'indice sera également rempli lors de la population de la table. Bien que cela faudra plus de temps, au moins il sera prêt à partir lorsque la tâche du râteau est terminée.


1 commentaires

La plupart des index sont créés de cette façon; toutefois; Contrairement à la croyance populaire, les sorciers d'Oracle et à Microsoft raconte constamment à leur DBA de reconstruire leurs indices lorsque la performance commence à être découlée. Également dans certains cas ETL, il est effectivement plus efficace d'indexer plus tard.



3
votes

MYSQL NDBCluster moteur peut créer l'index en ligne sans verrouiller les écritures sur la table. Cependant, le moteur InnoDb le plus largement utilisé ne prend pas en charge cette fonctionnalité. Un autre DB Postgres DB Open Source Postgres prend en charge "Créer un index".


2 commentaires

'Créer une index simultanément' a été ajouté à la version 8.2 ou là environ.


Récemment, nous utilisons Percona Toolkit pour faire des changements de schéma en ligne sans tables de verrouillage avec InnoDB.