【问题标题】:Same mariaDB inserts much more slower in PHP 7.4 than PHP 7.1 with FAT FREE同样的 mariaDB 在 PHP 7.4 中的插入速度比使用 FAT FREE 的 PHP 7.1 慢得多
【发布时间】:2024-01-14 11:20:02
【问题描述】:

我正在尝试将遗留的 PHP/Fat Free 项目从 php 7.1 迁移到 7.4,但我发现有些查询需要很长时间(比如 10 倍以上的时间)才能完成。特别是一些插页。我在我的本地主机中使用 xampp(7.1.32 和 7.4.6)运行相同的项目,并始终使用完全相同的 MariaDB 服务器(v10.4.8)和完全相同的数据库。

代码是这样的:

foreach($ridiculouslyLongArray as $row) //I'm talking about some millons of rows
  $this->db->exec("INSERT INTO a_table (field1, field2, fieldn) VALUES ('".$row['field1']."', '".$row['field2']."', '".$row['fieldn']."')"); 

//是的,它对sql注入开放,我也会修复它

$this->db的定义如下:

$this->db = new DB\SQL('mysql:host=localhost;port=3306;dbname=something', 'dbuser', 'dbpassword', array(\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION));

据我所知,它是 PDO 的包装器。

我尝试更改代码以在每个查询中插入多行,但查询仍然比 php 7.1 花费更多的时间。

这是我的设置

->原始项目(查询运行良好)

  • PHP 7.1.32(内存限制 2048mb)
  • 脱脂 3.6.4
  • MariaDB 10.4.8

->新项目(查询运行缓慢)

  • PHP 7.4.6(内存限制 2048mb)
  • 无脂 3.7.2
  • MariaDB 10.4.8(与前一个服务器和数据库相同)

感谢您的宝贵时间。

编辑:我刚刚注意到 MySQL 的 PDO 驱动程序在不同版本之间有所不同

对于 PHP 7.1:

  • mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $

对于 PHP 7.4:

  • mysqlnd 7.4.6

编辑 2:查询在事务中,它使用相同的索引和相同的 dB 引擎,因为在同一服务器上的同一数据库中的同一表上进行相同的插入。代码没有任何变化,只有 PHP 版本。

【问题讨论】:

  • 你们有相同的索引吗?你有相同的数据库引擎(InnoDB 或 MyISAM 等)吗?
  • 如果您要一次性插入数百万行,您可能会遇到内存问题。您应该将您的工作包装在 TRANSACTION 中。
  • 由于您的 Foreach 循环,您可能会遇到 SQL 阻塞,因此您应该重置查询缓存。为此,您可以尝试:*.com/questions/5231678/… 也许? (在黑暗中拍摄)
  • @Martin,我忘了提,但查询是在事务中,它使用相同的索引和相同的 dB 引擎,因为在同一服务器上的同一数据库中的同一表上插入相同.只有 PHP 版本的代码没有任何变化。我会试试缓存的东西。
  • 您必须提供更多调试信息才能获得可回答的问题。像“哦,这段代码错了,我稍后会修复它”,“哦,我忘了说”这样的问题根本不会做。您甚至无法确定是“一些查询”还是“数百万”。

标签: php mysql pdo mariadb fat-free-framework


【解决方案1】:

这在 cmets 中没有明确提及,但查询日志记录可能会导致速度变慢。

默认情况下,Fat-Free 将记录所有数据库查询。如果您正在运行大量插入,则会记录所有这些插入。如果还没有,我建议在生产中禁用查询日志记录。无论您的引导程序/服务文件在哪里创建数据库连接,我都会在其后添加:

$f3->set('db', new DB\SQL(/* config stuff */));
if(ENVIRONMENT === 'PRODUCTION') { // or whatever you use to signal it's production
    $f3->db->log(false);
}

【讨论】:

    最近更新 更多