Avoir un problème majeur tirer les cheveux avec des inserts extrêmement lents de Delphi 2010 à un serveur distant 5,09 MySQL. Jusqu'à présentinsert extrêmement lent de Delphi à base de données MySQL à distance
, j'ai essayé:
- ADO à l'aide de MySQL pilote ODBC
- Zeoslib v7 Alpha
- MyDAC
Je l'ai utilisé batching et insertion directe avec ADO (en utilisant le tableau access), et avec Zeos, j'ai utilisé l'insertion SQL avec une requête, puis utilisé le mode Table direct et également mis en cache le mode Table en utilisant applyupdates et commit. Avec MyDAC je mode d'accès de table, puis insérez SQL directe et insert SQL dosé
Toutes les technologies que j'ai essayé, je mis en compression et en dehors sans différence discernable.
Jusqu'à présent, j'ai vu à peu près la même chose à travers le tableau 7.5 enregistrements par seconde !!! Maintenant, je suppose que le serveur distant est lent, mais MySQL Workbench est incroyablement rapide, et la boîte à outils Migration a géré la migration initiale très rapidement (pour être honnête, je ne me souviens pas à quelle vitesse - ce qui signifie type de ce qu'il était rapide)
Modifier 1
il me est plus rapide pour d'écrire le SQL dans un fichier, télécharger le fichier sur le serveur via FTP, puis l'importer directe sur la serveur distant - Je me demande s'ils limitent peut-être le trafic MySQL entrant, mais cela n'explique pas pourquoi le MySQL Workbench était si rapide!
Edit 2
, le code a été au niveau le plus élémentaire:
while not qMSSQL.EOF do
begin
qMySQL.SQL.Clear;
qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)');
qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString;
qMySQL.ExecSQL;
qMSSQL.Next;
end;
J'ai ensuite essayé
qMySQL.CachedUpdates:=true;
i:=0;
while not qMSSQL.EOF do
begin
qMySQL.SQL.Clear;
qMySQL.SQL.Add('INSERT INTO tablename (fieldname1) VALUES (:fieldname1)');
qMySQL.ParamByName('fieldname1').asString:=qMSSQL.FieldByName('fieldname1').asString;
qMySQL.ExecSQL;
inc(i);
if i>100 then
begin
qMySQL.ApplyUpdates;
i:=0;
end;
qMSSQL.Next;
end;
qMySQL.ApplyUpdates;
Maintenant, dans ce code avec CachedUpdates:=False
(qui, évidemment, jamais vraiment écrit à la base de données) la vitesse était vif et rapide !! Pour être tout à fait honnête, je pense que c'est la connexion - je sentir c'est la connexion ... J'attends juste qu'ils reviennent à moi!
Merci pour votre aide!
Il sera très utile de détecter votre goulot d'étranglement si vous affichez votre code –
Quelle est la rapidité de l'insertion si vous utilisez un serveur local? Peut-être que c'est un problème lié au transport (connexion lente). – mjn
Votre code n'est pas correct. Définissez le code SQL * en dehors de la boucle, puis appelez Prepare. Dans la boucle, il suffit d'assigner le paramètre et de l'exécuter, sinon vous perdez les avantages des paramètres. Démarrer une transaction de manière explicite en dehors de la boucle, et valider à la fin. CachedUpdates défini sur False signifie que les données vont directement dans la base de données et ne sont pas mises en cache localement. N'utilisez pas CachedUpdates, ils n'étaient pas destinés à la vitesse. –