2011-01-26 2 views
1

Je dois créer une table basée sur une autre table dans MYsql incluant les contraintes et les index.Mysql create table basé sur une autre table incluant les index

J'ai scénario suivant:

Tableau A- existe probablement des millions de lignes. Je veux créer la table B avec exactement la même chose que la table A (incluant les contraintes et les indices). Traiter les données de A et d'autres sources et les insérer dans B. A la fin du traitement, supprimer la table A (supprimer les index associés à la table A) et Renommer la table B en A, y compris les indices.

Quelle est la meilleure façon de faire cela? La performance est ma vraie préoccupation.

Merci

Répondre

1

Dans les cas comme celui-ci, nous supposons que vous connaissez la structure de la table. En d'autres termes, vous ne demandez pas «comment puis-je savoir ce que sont toutes ces colonnes, index et contraintes».

Deuxièmement, nous avons tendance à supposer que toutes les données dans le tableau A est valide, de sorte que vous ne pas besoin d'imposer des contraintes lors de la copie de A à B.

Votre « une autre source » est un caractère générique. Je suppose que vous ne savez pas si cette autre source contient des données valides, et suggère:

1) Créer B w/o indeces ou contraintes

2) Copier/insertion en bloc de « autre source » à B

3) Exécuter des contraintes en émettant SELECTS pour trouver des lignes invalides. Ignorez cette étape si vous savez que les données sont valides. Une fois qu'il est correct de continuer:

4) Copiez A à B en "morceaux". Le problème ici est qu'un droit SELECT ... INTO ... de tous les X millions de lignes prendra une éternité (en raison de l'explosion des ressources nécessaires pour le faire dans une seule transaction implicite), mais une rangée par rangée sera également prendre une éternité (parce que c'est tout simplement lent à faire une rangée à la fois). Ainsi, vous traitez des blocs de 1000 ou 10000 lignes à la fois.

5) Lorsque toutes les données sont copiées sur, ajoutez les indeces

6) Ajouter les contraintes

7) Laisser un

8) Renommer B

+0

CREATE TABLE ... LIKE oldtable' pourrait être utile ici, bien qu'il copiera les définitions d'index. –

+1

Merci Marc, j'utilise probablement LIKE, mon hésitation est due à la description suivante de la déclaration LIKE ... CREATE TABLE ... LIKE ne conserve aucune option de table DATA DIRECTORY ou INDEX DIRECTORY qui a été spécifiée pour la table d'origine ou toute définition de clé étrangère. Actuellement, je n'ai aucune clé étrangère dans la table, donc je vais probablement avec cela. @ Ken, je ne peux pas faire ce que vous avez suggéré car j'ai besoin de traiter le contenu de la table d'origine avec de nouvelles données simultanément. – Mahesh

Questions connexes