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

PHP PDO查询,优化速度性能超过1000万行MS ACCESS数据库,php,mysql,ms-access,pdo,etl,Php,Mysql,Ms Access,Pdo,Etl,我必须将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 =

我必须将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

你有一些选择来加速这一进程

  • 尝试更大批量的行(页)。使用ODBC接口获取每行40K行可能比获取4K行快得多
  • Access在用户界面的“工具”或“管理”部分有一个“压缩和修复数据库”命令。也许清理它会使您的操作更快,尤其是在数据库已经使用了一段时间的情况下。先把它倒回去。这需要停机时间
  • 将Access表导出到文件系统上的.csv文件中,然后使用LOAD DATA Inflie将其导入MySQL。.csv导出可能比odbc查询快得多
  • 在dotnet(C#)中重写提取/传输/加载程序。dotnet有一个本机接口,而不是ODBC接口,用于读取access文件,速度可能要快得多
不管你使用了多少聪明的技巧,对一千万行进行ETL都需要一段时间


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

请试试这个,让我们看看你有没有考虑过二叉树?二叉树?不明白@Nelles@nbk这种迁移不是一次性的,我必须周期性地按程序进行。必须插入新记录,如果更改,则更新旧记录。我的算法已经准备好了,但是这段代码每分钟持续35秒吗cycle@Nelles我研究了二叉树选项,这是我发现的
不太正确,因为Access(better:Jet)不支持递归查询。SQL Server 2005确实如此,因此,也许您应该看看免费的Express Edition
,我希望我可以触摸Access应用程序,但离我的手还很远。我将测试前三点,因为第四点是我不能做的(我的客户希望Debian 8机器上有旧的PHP5.6…)您可以在另一台机器(windows)上运行.Net应用程序,并在Debian上连接到mysql,或者在您可以使用的linux上连接到mysql。但若我同意你们的意见,我会说服客户改善环境(迁移到MySQL或SQL Server作为后端),否则他就得为我带来的痛苦付四倍的钱。