PHP PDO 查询,优化超过 1000 万行 MS ACCESS 数据库的速度性能

PHP PDO query, optimize speed performance over 10 million rows MS ACCESS database

我必须将 MS Access 数据库导入 MySQL。其中一张表有近 1000 万条记录。我试图每次都进行 4000 行的分页。问题是 MS Access 查询持续超过 35 秒(4000 行分页中的 35 秒大约是 24 小时...)。

这是 MS Access 连接的代码:

$dataSourceName = "odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=".$this->dbPath."; Pwd=";
$this->connection = new PDO($dataSourceName, "", "");
$sql = "SELECT TOP $pageSize * FROM $table WHERE $table.$primaryField > $lastIndex ORDER BY $table.$primaryField";
$rs  = $this->connection->query($sql)->fetchAll(\PDO::FETCH_ASSOC);

$primaryField 在 Access 中是一个整数(主键)。

我怎样才能加快这个查询的速度?我做错了什么吗?

您的任务通常称为 ETL for extract-transform-load。

您有一些替代方法可以加快速度。

  • 尝试更大批量的行(页)。使用 ODBC 接口获取每行 40K 行可能比获取 4K 行快得多。
  • Access 在用户界面的“工具”或“管理”部分中有一个 "Compact and Repair Database" 命令。也许清理它会使您的操作更快,特别是如果数据库已经使用了一段时间。先备份一下。这需要停机时间。
  • 将 Access table 导出到文件系统上的 .csv 文件,然后使用 LOAD DATA INFILE 将其导入 MySQL。 .csv 导出可能比您的 odbc 查询快得多。
  • 在 dotnet (C#) 中重写您的提取/传输/加载程序。 dotnet 有一个本地接口,而不是 ODBC,用于读取访问文件的接口,而且速度可能要快得多。

无论您使用多少巧妙的技巧,ETL 千万行都需要一段时间。

您的一千万个 Access 行一天都更改多次似乎不太可能。如果有办法只提取/转换/加载更改的行,那是最好的选择。但这可能是数据更改,您可能不想接触该 Access 应用程序。