MySql: importer un gros fichier de données

J’ai été confronté à un besoin urgent d’importer en base de données un gros fichiers de datas d’environ 30 millions de lignes.

Au début, naivement, j’ai laissé mon application se débrouiller avec ce fichier. au bout de quelques jours, je me suis rendu compte que ca devenait de plus en plus compliqué d’écrire en base puisque plus j’écrivais, plus c’était long d’écrire (effet de masse).

je suis donc parti à la recherche d’un moyen plus rapide d’importer, j’ai donc essayé:

1- mysql -uuser -ppassword dbname < /path_to_sql/

2-mysql -uuser -ppassword dbname
>source /path_to_sql/

3- mysql --local-infile -uuser -ppassword dbname
>LOAD DATA LOCAL INFILE '/tmp/import.txt' INTO TABLE T1 FIELDS TERMINATED BY "," LINES TERMINATED BY "\n";

et la méthode la plus efficace est de loin la dernière LOAD DATA LOCAL

j’ai dû changer mon fichier sql en un fichier CSV de données, mais sinon l’import est 50  fois plus rapide.

j’ai fait un test également en supprimant les index, et c’est vrai que pour le coup, on a un gain phénoménal de temps d’import. Cela dit, je ne sais pas encore s’il faut:

1-créer une table sans index, lancer l’import des données, puis recréer les index avec un ALTER TABLE

2- ou créer une table avec les index, puis lancer l’import des données

la première méthode est beaucoup plus rapide à l’import, mais il faut compter le temps de création des index qui peut être très long !

n’hésitez pas si vous avez un avis la dessus :)

PS1: j’ai trouvé un super tuto d’it-connect qui explique étape par étape comment utiliser la méthode LOAD DATA LOCAL,

PS2: si en lançant la commande vous tombez sur une erreur vous disant que la commande n’est pas autorisée avec la version de mysql  (The used command is not allowed with this MySQL version), alors faites comme moi, ajoutez l’option “–local-infile” lorsque vous vous connectez à mysql ! ça réglera le problème.