7
votes

Insérez beaucoup de données dans la base de données dans de très petits inserts

J'ai donc une base de données là où il y a beaucoup de données insérées à partir d'une application Java. Usualy I Insérer dans Table1 Obtenez le dernier identifiant, puis insérez-vous dans la table2 et obtenez le dernier identifiant à partir de là et insérez enfin dans la table 3 et obtenez cet identifiant aussi bien et travaillez-le dans l'application. Et j'insère environ 1000-2000 rangées de données toutes les 10-15 minutes.

et en utilisant beaucoup de petits inserts et sélectionne sur un serveur Web de production n'est pas vraiment bon, car il tourne parfois sur le serveur.

Ma question est la suivante: Y a-t-il une façon d'insérer plusieurs données dans Tableau1, Table2, Table3 sans utiliser une telle quantité de sélection et d'insertions? Y a-t-il une technique SQL-FU qui me manque?


0 commentaires

3 Réponses :


2
votes

Il y a beaucoup à parler ici:

  1. Il est probable que la latence de réseau vous tue si chacun de ces insertions est une autre rondeau de réseau. Essayez de combiner vos demandes afin qu'elles ne nécessitent qu'un seul aller-retour pour la transaction complète.
  2. En parlant de transactions, vous ne les mentionnez pas. Si les trois de ces insertions doivent être une seule unité de travail, vous feriez mieux de manipuler des transactions correctement. Si vous ne savez pas comment, mieux les rechercher.
  3. Essayez de mettre en cache des demandes si elles sont réutilisées beaucoup. La ronde la plus rapide est celle que vous ne faites pas.

0 commentaires

6
votes

Puisque vous comptez probablement sur les touches primaires Auto_incrimentation, vous devez faire les insertions une à la fois, au moins pour table1 et table2. Parce que MySQL ne vous donnera pas plus que la dernière clé générée.

Vous ne devez jamais avoir à choisir. Vous pouvez obtenir le dernier identifiant inséré à partir de l'instruction à l'aide de la méthode getGeneratedheys () . Voir un exemple montrant celui-ci dans le manuel MySQL pour le connecteur / J:

http://dev.mysql.com/doc/refman/5.1/fr/connector-j-usagenotes-basic.html#connector-j-examples-autOtOtOtincreMrent-getGeneratedkeys

Autres recommandations:

  • Utilisez Multi-Row Insérer Syntaxe pour table3.
  • Utilisez Alter Table Désactiver les touches pendant que vous importez et réactivez-les lorsque vous avez terminé.
  • Utilisez des transactions explicites. C'est à dire. Commencez une transaction avant votre routine de chargement de données et commettez à la fin. Je vous engagerais probablement aussi après toutes les 1000 rangées de table1.
  • Utilisez des déclarations préparées.

    Malheureusement, vous ne pouvez pas utiliser la méthode la plus rapide pour la charge en vrac de données, charger des données de charge , car cela ne vous permet pas d'obtenir les valeurs d'identification générées par ligne.


0 commentaires

1
votes

Vous pouvez redéfinir votre base de données de sorte que la clé primaire n'était pas une valeur générée par la base de données générée par la base de données, mais plutôt une UUID générée par le client. Ensuite, vous avez pu générer toutes les clés de chaque enregistrement initial et lottez les inserts, mais vous le souhaitez.


1 commentaires

Bonne idée, mais il y a un mais ... le temps de redéfinir la base de données serait trop fastidieux. Il y a une redédition de base de données planifiée mais pas maintenant.