【发布时间】:2010-04-30 11:16:15
【问题描述】:
从 Delphi 2010 到远程 MySQL 5.09 服务器的插入速度极慢,存在一个严重的问题。
到目前为止,我已经尝试过:
- 使用 MySQL ODBC 驱动程序的 ADO
- Zeoslib v7 Alpha
- MyDAC
我在 ADO 中使用了批处理和直接插入(使用表访问),在 Zeos 中我使用了带有查询的 SQL 插入,然后使用了直接表模式,还使用了应用更新和提交缓存更新表模式。使用 MyDAC,我使用表访问模式,然后直接 SQL 插入,然后批量 SQL 插入
我尝试过的所有技术,我都打开和关闭了压缩,没有明显的区别。
到目前为止,我已经看到了几乎相同的每秒 7.5 条记录!!!
现在,我从这一点开始假设远程服务器很慢,但 MySQL Workbench 速度非常快,并且迁移工具包非常快速地管理了初始迁移(老实说,我不记得有多快 -哪种表示它很快)
编辑 1
将 sql 写入文件,通过 ftp 将文件上传到服务器,然后将其直接导入远程服务器,这对我来说更快——我想知道他们是否可能会限制传入的 MySQL 流量,但这并没有解释为什么 MySQL Workbench 这么快!
编辑 2
在最基本的层面上,代码是:
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;
然后我尝试了
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;
现在,在这段带有CachedUpdates:=False(显然从未真正写回数据库)的代码中,速度快得惊人!!
老实说,我认为这是一种联系 - 我感觉这是一种联系......只是等待他们回复我!
感谢您的帮助!
【问题讨论】:
-
如果您显示您的代码,这将非常有助于检测您的瓶颈
-
如果使用本地服务器,插入速度有多快?可能是与传输相关的问题(连接速度慢)。
-
您的代码不正确。将 SQL 代码设置在循环外部,然后调用 Prepare。在循环内部只需分配参数并执行,否则您将失去参数的优势。在循环外显式启动事务,并在最后提交。 CachedUpdates 设置为 False 意味着数据直接进入数据库并且不在本地缓存。不要使用 CachedUpdates,它们不是为了速度。
-
@idsandon - 这只是测试代码,我实际上已经尝试使用不同的技术和组件进行多次迭代,但完全没有运气。