0

我正在尝试使用 CRBatchMove 使用 Delphi 2007 将旧数据库(MS Access)中的表导入 MySQL 服务器。

该程序通过 ODBC 连接从遗留数据库中获取数据,并使用 TADOTable.SaveToFile() 将其存储在本地硬盘驱动器上。程序的第二部分将该文件读入另一个 TADOTable 并使用 TCRBatchMove 将其传输到 MySQL 服务器(通过 DevArt 的 TMyTable)。在此过程中,由于某种原因,批处理移动似乎非常缓慢。

以下试验中的数据量约为 100,000 条记录,每条记录约 120 个字段。大多数字段是整数和 VARCHAR(每个 VARCHAR 小于 32 个字符)。

我得到的性能数据是:

Time taken to bring data to local file over ODBC connection: 17 seconds
Time taken to load data from local file into TADOTable: 3 seconds
Time taken by TCRBatchMove to move data from TADOTable to TMyTable: > 30 minutes

MySQL 服务器在开发机器(i7-2.8GHz)上本地运行,否则数据库非常快速)。

为什么批量移动将数据推送到 MySQL 服务器这么慢。有没有办法加快这项任务?还是有更好的方法来实现这一点?

4

1 回答 1

1

不是一个真正的答案,但我的评论空间不足。

MySQL 有一个函数叫做load data infile
见:http ://dev.mysql.com/doc/refman/5.1/en/load-data.html

您可以使用它来计算插入数据的最快时间。这将为您提供 MySQL 插入时间的基线,并允许您确定延迟是在 MySQL 中还是在 Delphi 中。如果您有 TMyTable 的源代码,您也可以使用分析器。

另一种选择是在以下位置下载 ZEOS 数据访问组件:http:
//sourceforge.net/projects/zeoslib/
如果您使用的组件中有一些问题,则更改工具集可能会解决问题。(Devart 的组件通常都很出色)。

在 MySQL 方面,您可以在批量插入之前禁用索引更新并在之后启用索引。如果您有很多插入通常会更快。
请参阅:https ://stackoverflow.com/a/9524988/650492

SET autocommit=0; 
SET unique_checks=0; 
SET foreign_key_checks=0;

your insert here

SET autocommit=1; 
SET unique_checks=1; 
SET foreign_key_checks=1;
于 2012-12-19T17:36:13.380 回答