同样的mariaDB在PHP7.4中的插入速度比PHP7.1中的无脂插入速度慢得多

同样的mariaDB在PHP7.4中的插入速度比PHP7.1中的无脂插入速度慢得多,php,mysql,pdo,mariadb,fat-free-framework,Php,Mysql,Pdo,Mariadb,Fat Free Framework,我正在尝试将一个遗留的PHP/Fat免费项目从PHP7.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->

我正在尝试将一个遗留的PHP/Fat免费项目从PHP7.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的包装

我试图更改代码,使其在每个查询中插入多行,但查询仍然比PHP7.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驱动程序在不同版本之间是不同的

对于PHP7.1:

  • mysqlnd 5.0.12-dev-20150407-$Id:38fea24f2847fa7519001be390c98ae0acafe387$
对于PHP7.4:

  • mysqlnd 7.4.6

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

注释中没有明确提到这一点,但另一个可能导致速度缓慢的原因是查询日志记录

默认情况下,Fat Free将记录所有DB查询。如果您正在运行大量插入,那么所有这些插入都将被记录。如果还没有,我建议在生产环境中禁用查询日志记录。无论您的引导/服务文件在哪里创建db连接,我都会在它之后添加以下内容:

$f3->set('db',new db\SQL(/*config stuff*/);
if(ENVIRONMENT==='PRODUCTION'){//或任何您用来表示其生产的信号
$f3->db->log(假);
}

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