web-dev-qa-db-fra.com

Comment mysql peut-il insérer des millions d'enregistrements plus rapidement?

Je voulais insérer environ des millions d'enregistrements dans ma base de données, mais cela a été très lent avec une vitesse d'environ 40 000 enregistrements/heure, je ne pense pas que mon matériel soit trop lent, car j'ai vu que la disquette est inférieure à 2 Mio/s. J'ai de nombreuses tables séparées dans différents fichiers .sql. Un seul enregistrement est également très simple, un enregistrement a moins de 15 colonnes et une colonne a moins de 30 caractères. J'ai fait ce travail sous archlinux avec mysql 5.3. Avez-vous des idées? Ou cette vitesse n'est-elle pas lente?

19
Cricket

C'est probablement parce que vous insérez des enregistrements comme celui-ci:

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");

L'envoi d'une nouvelle requête chaque fois que vous devez INSERT quelque chose ne va pas. Au lieu de cela, combinez simplement toutes ces requêtes en une seule requête, comme ceci.

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");

Vous pouvez également en savoir plus sur la vitesse d'insertion dans le MySQL Docs . Il décrit clairement les éléments suivants.

Pour optimiser la vitesse de l'insert, combinez plusieurs petites opérations en une seule grande opération. Idéalement, vous établissez une seule connexion, envoyez les données de nombreuses nouvelles lignes à la fois et retardez toutes les mises à jour d'index et la vérification de cohérence jusqu'à la fin.

Bien sûr, ne les combinez pas TOUS, si le montant est ÉNORME. Supposons que vous ayez 1000 lignes à insérer, puis ne le faites pas une à la fois. Mais vous ne devriez probablement pas essayer également d'avoir les 1000 lignes dans une seule requête. Au lieu de cela, divisez-le en petites tailles.

Si c'est encore très lent, c'est peut-être parce que votre serveur est lent.

Notez que vous n'avez bien sûr pas besoin de tous ces espaces dans la requête combinée, c'est simplement pour avoir un meilleur aperçu de la réponse.

35
Vallentin