2017-09-27 5 views
1

J'ai 4 tables MYSQL plus grandes.
Chacun avec environ 10 millions de lignes. Les tables contiennent uniquement un ID unique.Comment mieux fusionner quatre grandes tables

Certaines tables peuvent contenir des doublons d'ID dans d'autres tables. Je veux juste garder l'un d'entre eux dans la table finale fusionnée.

Donc, fondamentalement, j'ai besoin d'exporter les 4 tables et les combiner en une grande table de plus de 40 millions de lignes sans doublons.

Quel est le meilleur moyen d'atteindre tout cela, avec des fichiers relativement plus gros? Je suis en train de courir dans les limites de l'exportation/importation dans phpmyadmin, donc je vais probablement le faire depuis la ligne de commande.

Répondre

0

Comme d'autres l'ont mentionné, MySQL prend en charge une option pour INSERT IGNORE... qui signifie essayer l'insert, mais pour chaque ligne, si elle est en conflit avec une clé unique (ou les résultats d'une autre erreur comme défaut d'un NOT NULL ou une clé étrangère check), il saute simplement la ligne et continue pour insérer la ligne suivante.

Vous connaissez probablement l'outil mysqldump fourni avec MySQL. Il a une option pour exporter des données avec la syntaxe INSERT IGNORE.

Vous devez également ignorer CREATE TABLE car si vous importez quatre jeux de données dans la même table de destination, vous n'avez pas besoin de créer la table quatre fois.

Alors, voici ce que je recommande:

Sur un de vos serveurs, obtenir la définition de table uniquement. Si elles sont toutes identiques, peu importe quel serveur vous obtenez ce à partir de:

mysqldump --no-data mydatabase mytable > create.sql 

alors obtenir des données que de chacun de vos quatre serveurs:

mysqldump --no-create-info --insert-ignore mydatabase mytable > data1.sql 

(également pour data2.sql , data3.sql, data4.sql, un pour chaque serveur)

Copiez les fichiers de vidage sur le serveur sur lequel vous souhaitez fusionner les données.

Créer la table:

mysql mydestdatabase < create.sql 

charge toutes les données:

pv -pert data*.sql | mysql mydestdatabase 

J'aime utiliser pv -pert pour cela, car il montre une barre de progression. Vous devrez peut-être installer pv car il n'est pas présent par défaut sur la plupart des systèmes. Si vous ne voulez pas faire cela, utilisez simplement cat.

+0

Merci pour la réponse en profondeur! ça a marché – KyleK

0

Vous pouvez exécuter quatre commandes "insert into", ou l'opérateur UNION peut également fonctionner.

+0

Les 4 tables sont toutes sur des serveurs distincts. J'ai besoin de les exporter/exporter. Alors comment puis-je les importer mais fusionner en même temps? Ou est-ce que je fais juste quatre insertions séparées, et les identifiants en double seront ignorés ?? Depuis theyre uniques? – KyleK

+0

Vous faites déjà un vidage/exportation ... pourriez-vous faire quelque chose pour supprimer les doublons avant de faire l'importation? – theGleep

0

MySql a INSERT IGNORE qui vous permet d'insérer heureusement de toutes les tables l'une après l'autre. Le SGBD prendra soin (dans le sens du rejet) des doublons.

Cela peut ne pas être l'option la plus efficace mais j'ai supposé que ce serait une opération ponctuelle.

0

Définissez les 4 tables comme ayant chacune l'ID étant une clé primaire unique. Ensuite, faites simplement une jointure externe des 4 tables.

+0

Ils sont tous sur des serveurs différents. Je ne veux pas les importer dans le même DB que les tables séparées, puis Join. De préférence, je veux le faire en une seule opération. rejoignez-les/insérez-les ensemble en même temps dans la table finale. Comment ferais-je cela? Comme après avoir mysqldumped tous dans les fichiers SQL, y a-t-il une commande pour les fusionner/les joindre avant de les insérer? Ou est la seule façon d'insérer tous séparément, puis rejoindre? – KyleK