web-dev-qa-db-fra.com

MySQL copie efficacement tous les enregistrements d'une table à une autre

Existe-t-il un moyen plus efficace et moins laborieux de copier tous les enregistrements d'une table à une autre en procédant ainsi:

INSERT INTO product_backup SELECT * FROM product

En règle générale, la table product contiendra environ 50 000 enregistrements. Les deux tableaux ont une structure identique et comportent 31 colonnes. Je voudrais souligner que c'est pas ma conception de base de données, j'ai hérité d'un système hérité.

20
crmpicco

Il vous manque juste une chose. En particulier, si vous utilisez InnoDB, souhaitez-vous ajouter explicitement une clause ORDER BY dans votre instruction SELECT pour vous assurer que vous insérez des lignes dans l'ordre de la clé primaire (index cluster):

INSERT INTO product_backup SELECT * FROM product ORDER BY product_id

Envisagez de supprimer les index secondaires de la table de sauvegarde s'ils ne sont pas nécessaires. Cela permettra également d'économiser une certaine charge sur le serveur.

Enfin, si vous utilisez InnoDB, réduisez le nombre de verrous de ligne requis et verrouillez explicitement les deux tables:

LOCK TABLES product_backup WRITE;
LOCK TABLES product READ;
INSERT INTO product_backup SELECT * FROM product ORDER BY product_id;
UNLOCK TABLES;

Le verrouillage ne fera probablement pas une énorme différence, car le verrouillage de ligne est très rapide (mais pas aussi rapide que les verrous de table), mais depuis que vous l'avez demandé.

19
Marcus Adams

Je pense que c'est la meilleure façon de copier des enregistrements d'une table à une autre. De cette façon, vous conservez également les index existants de la table cible.

12
Romil Kumar Jain
mysqldump -R --add-drop-table db_name table_name > filepath/file_name.sql

Cela prendra un vidage des tables spécifiées avec une option de suppression pour supprimer la table existante lorsque vous l'importez. alors fais,

mysql db_name < filepath/file_name.sql
4
satdev86

DROP la table de destination:

DROP TABLE DESTINATION_TABLE;
CREATE TABLE DESTINATION_TABLE AS (SELECT * FROM SOURCE_TABLE);
2
Ice Cream

Je ne pense pas que ce sera digne pour une table de 50k mais: Si vous avez le vidage de la base de données, vous pouvez recharger une table à partir de celle-ci. Comme vous voulez charger une table dans une autre, vous pouvez changer le nom de la table dans le vidage avec une commande sed: Voici quelques conseils: http://blog.tsheets.com/2008/tips-tricks/ mysql-restoring-a-single-table-from-a-huge-mysqldump-file.html

Une alternative (selon votre conception) serait d'utiliser des déclencheurs sur les insertions de table d'origine afin que la table dupliquée obtienne également les données.

Et une meilleure alternative serait de créer une autre instance MySQL et de l'exécuter dans une configuration maître-esclave ou dans un mode quotidien de vidage maître/charge esclave.

1
mihaisimi