2011-11-02 4 views
1

J'ai des données contenant environ 30 000 enregistrements. Et j'ai besoin d'insérer ces données dans la table MySQL. Je groupe ces données en paquets de 1000 et créer de multiples inserts comme ceci:Performance d'insertion multiple MySQL

INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000); 

Comment puis-je optimiser les performances de cette insertion? Puis-je insérer plus de 1000 enregistrements par heure? Chaque ligne contient des données d'une taille d'environ 1 Ko. Merci.

Répondre

3

Vous devez vérifier les configurations du serveur mysql et vérifier spécifiquement la taille de la mémoire tampon, etc.

Vous pouvez supprimer des index de la table, le cas échéant, pour le rendre plus rapide. Créer les index onces données est.

Regardez ici, vous devriez obtenir tout ce dont vous avez besoin.

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

Une déclaration d'insertion avec plusieurs valeurs, il est dit, est beaucoup plus rapide que plusieurs instructions d'insertion.

+0

Thaks. Mais la table est si simple. Il n'a pas d'index. Et a le type MyISAM – pltvs

3

Est-ce une opération unique? Si tel est le cas, générez simplement une seule instruction sql par élément de données et exécutez-les toutes sur le serveur. 30 000 ne devrait pas prendre très longtemps et vous aurez le moyen le plus simple d'entrer vos données.

+0

Tous les enregistrements insérer avec succès. Mais cela prend près de 1,5 secondes. J'ai besoin de réduire ce temps. – pltvs

+5

1,5 secondes pour insérer 30000 enregistrements est assez bon dans mon livre. Montrez simplement une minuterie tournante et attendez. –

5

Essayez d'envelopper votre encart en vrac dans une transaction.

START TRANSACTION 
INSERT INTO `table_name` VALUES (data1), (data2), ..., (data1000); 
COMMIT 

Cela peut améliorer les performances, je ne sais pas si mySQL peut partiellement commettre un insert en vrac bien (si elle ne peut alors cette aide ne sera pas vraiment probablement beaucoup plus)

Rappelez-vous que même à 1,5 secondes, pour 30 000 enregistrements chacun à ~ 1k de taille, vous faites 20 Mo/s de vitesse de livraison, vous pourriez être limité en fonction de votre configuration matérielle. Il est alors conseillé d'étudier un SSD ou de modifier votre configuration Raid ou d'obtenir des disques mécaniques plus rapides (il y a beaucoup d'articles en ligne sur les avantages et les inconvénients de l'utilisation d'un db SQL monté sur un SSD).

+0

Enveloppant une boucle 'insert' en bloc dans le corps d'une transaction réduit considérablement la quantité d'E/S disque et accélère l'opération sur ma base de données avec InnoDB et les disques PATA bon marché. Je suis curieux de savoir si ce truc est fiable et portable. C'est sur MySQL 5.6 et Linux 2.6.32. – davide

+1

Cette méthode est relativement fiable et portable car, en interne, toutes les opérations d'insertion sans transaction créent et effectuent des transactions individuelles, ce qui entraîne un surdébit d'E/S significatif. Cette méthode améliore sensiblement les performances de presque toutes les bases de données relationnelles et la seule différence par rapport à la non-utilisation d'une transaction est que l'insertion entière sera annulée ou validée plutôt que de permettre la validation de certaines insertions tandis que d'autres échoueront. – Seph

+2

Cela m'a aidé BIG TIME. Je faisais des morceaux de 100 (enregistrements max api par requête GET) INSERT INTO ... SUR DUPLICATE KEY UPDATE ... Il allait prendre 2,30 heures pour 123k enregistrements en utilisant $ mysqli-> multi_query(), encapsulé chaque morceau avec la transaction et il a fallu 20 minutes pour tous les disques 123k. Je suis allé déjeuner très heureux. –