2010-03-17 7 views
21

Parfois, je dois ré-importer des données pour un projet, lisant ainsi environ 3,6 millions de lignes dans une table MySQL (actuellement InnoDB, mais je ne suis pas vraiment limité à ce moteur). "Load data infile ..." s'est avéré être la solution la plus rapide, mais il a un compromis: - lors de l'importation sans clé, l'importation elle-même prend environ 45 secondes, mais la création de la clé dure longtemps (20 minutes). ..). - L'importation avec des touches sur la table rend l'importation beaucoup plus lenteMySQL charger les données infile - accélération?

Il y a des touches sur 3 champs de la table, en référence aux champs numériques. Y a-t-il un moyen d'accélérer cela?

Un autre problème est: lorsque je termine le processus qui a démarré une requête lente, il continue à s'exécuter sur la base de données. Est-il possible de terminer la requête sans redémarrer mysqld?

Merci beaucoup dba

+0

Quelle est la taille des enregistrements? – Grumpy

+0

environ 60 à 100 octets, 5 à 8 champs. Rien de vraiment grand, c'est la grande quantité qui rend tout ça lent. – DBa

Répondre

38

si vous utilisez innodb et le chargement en bloc voici quelques conseils:

trier votre fichier csv dans l'ordre de clé primaire de la table cible: souvenez-vous innodb utilise clés primaires en cluster afin qu'il se charge plus rapidement si elle est triée!

données de charge typique infile i utilise:

truncate <table>; 

set autocommit = 0; 

load data infile <path> into table <table>... 

commit; 

autres Optimisations vous pouvez utiliser pour augmenter les temps de chargement:

set unique_checks = 0; 
set foreign_key_checks = 0; 
set sql_log_bin=0; 

diviser le fichier csv en petits morceaux

stats d'importation typiques i avoir observé lors de charges en vrac:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

La désactivation de la fonction unique_checks a déjà amélioré les performances, ainsi que le tri par clé primaire. Merci! – DBa

1

InnoDB est un très bon moteur. Cependant, il dépend fortement d'être «accordé». Une chose est que si vos insertions ne sont pas dans l'ordre d'augmentation des clés primaires, innoDB peut prendre un peu plus de temps que MyISAM. Cela peut facilement être surmonté en définissant un plus grand innodb_buffer_pool_size. Ma suggestion est de le définir à 60-70% de votre RAM totale sur une machine MySQL dédiée.

Questions connexes