2010-06-09 21 views
0

Il semble qu'une base de données MySQL qui a une table avec des dizaines de millions d'enregistrements aura une grande déclaration INSERT INTO lorsque les conditions suivantesLoisirs de MySQL DB en utilisant "mysql mydb <mydb.sql" est vraiment lent quand la table a des dizaines de millions d'enregistrements. Comment l'améliorer?

mysqldump some_db > some_db.sql 

est fait pour sauvegarder la base de données. (Est-il une instruction d'insertion qui gère tous les dossiers?)

Ainsi, lors de la reconstruction de la DB en utilisant

mysql some_db < some_db.sql 

la CPU est peu occupé (environ 1,8% l'utilisation par le processus de MySQL ... Je ne vois pas non plus un mysqld?) Et aussi le disque dur ne semble pas être trop occupé ...

La dernière fois, l'ensemble du processus de restauration a pris 5 heures. Y a-t-il un moyen de le rendre plus rapide? Tels que, en faisant mysqldump, peut-il casser l'instruction INSERT en plus courts, de sorte que le mysql n'a pas besoin d'analyser la ligne si dur lors de la restauration de la base de données?

Répondre

2

Si quelque chose utilise le temps, ce sera mysqld, c'est ce qui fait tout le travail. Si vous vous connectez à un serveur mysql distant, alors mysqld sera sur cette machine, pas sur votre serveur local.

La manière la plus directe de l'accélérer serait de supprimer toutes les clés et tous les index de la table, puis de les créer une fois les données chargées. Garder tout mis à jour pour autant d'insertions peut être très lourd sur un serveur, et vous risquez de vous retrouver avec des index fragmentés de toute façon. Vous pouvez vous attendre à ce que la création de l'index à la fin des insertions prenne un peu de temps, mais ce ne sera pas aussi grave que de les tenir à jour au fur et à mesure que les insertions ont lieu.

Une meilleure solution serait d'arrêter d'utiliser mysqldump pour cette table et d'utiliser LOAD DATA INFILE (avec le SELECT ... INTO OUTFILE correspondant pour créer la sauvegarde).

Votre meilleur pari serait simplement de copier les fichiers de base de données au lieu d'essayer de faire une sauvegarde et de restaurer. Je pense que cela fonctionne uniquement avec les bases de données MyISAM et non InnoDB, mais quelqu'un d'autre peut me corriger si les choses ont changé récemment.

+0

Copier les fichiers: Seul MyISAM, et un verrou sur la table lors de la copie ('mysqlhotcopy' vient à l'esprit). – Wrikken

+0

il crée la DB sur le disque dur local, donc je pense que le mysqld devrait être sur la machine locale, mais pour une raison quelconque, quand je fais un "ps -a" ou si je regarde le moniteur d'activités sur un Mac avec Snow Leopard, je ne vois que le processus mysql mais pas le mysql. –

+0

mysqld s'exécute généralement en tant qu'utilisateur mysql. Je ne connais pas assez la ligne de commande osx ps pour vous dire quels commutateurs utiliser, mais vous devez voir tous les processus de tous les utilisateurs pour les trouver. – Donnie