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

Posted

技术标签:

【中文标题】PHP PDO 查询,优化超过 1000 万行的速度性能 MS ACCESS 数据库【英文标题】:PHP PDO query, optimize speed performance over 10 million rows MS ACCESS database 【发布时间】:2020-01-30 17:43:00 【问题描述】:

我必须将一个 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 中是一个整数(主键)。

如何加快查询速度?我是不是做错了什么?

【问题讨论】:

请试试这个dev.mysql.com/doc/workbench/en/…然后让我们运行 你考虑过二叉树吗? 二叉树?不明白@Nelles @nbk 此迁移不是一次,我必须定期以编程方式进行。如果更改,必须插入新记录并更新旧记录。我的算法已经准备好了,但是这段代码每个周期持续 35 秒 @Nelles 我研究过二叉树选项,这是我发现的Not really, because Access (better: Jet) does not support recursive queries. SQL Server 2005 does, so perhaps the free Express Edition is something you should be looking at 【参考方案1】:

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

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

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

不管你使用多少巧妙的技巧,ETL 处理一千万行都需要一段时间。

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

【讨论】:

我希望我可以触摸那个 Access 应用程序,但离我的手还很远。我将测试第三点,因为第四点是我做不到的(我的客户想要在 Debian 8 机器上安装旧的 php 5.6 ....) 您可以在另一台机器(Windows)上运行 .Net 应用程序并连接到 debian 上的 mysql,或者在 linux 上您可以使用 Mono。但如果我在你的位置,我会说服客户改善环境(迁移到 MySQL 或 SQL Server 作为后端),否则他必须为造成的痛苦支付四倍的费用。

以上是关于PHP PDO 查询,优化超过 1000 万行的速度性能 MS ACCESS 数据库的主要内容,如果未能解决你的问题,请参考以下文章

优化 100 万行的查询

对约 225 万行的单表进行选择查询的优化技术?

如何在 SQL Server 中更新具有数百万行的大表?

我可以将超过 100 万行的 SQL 结果复制并粘贴到 Excel 中吗?

有没有办法加快对 t1 和 t1 中百万行的查询?

sql 10多万行的数据 求助