与 FAT FREE 的 PHP 7.1 相比,相同的 mariaDB 在 PHP 7.4 中的插入速度要慢得多

Same mariaDB inserts much more slower in PHP 7.4 than PHP 7.1 with FAT FREE

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

中花费更多时间

这是我的设置

->原始项目(其中查询 运行 很好)

->新建项目(其中查询运行慢)

感谢您的宝贵时间。

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

对于 PHP 7.1:

对于 PHP 7.4:

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

评论中没有明确提到这一点,但可能导致速度缓慢的其他原因是查询日志记录。

默认情况下,Fat-Free 将记录所有数据库查询。如果您是 运行 大量插入,那么所有这些插入都会被记录下来。如果还没有,我会建议在生产中禁用查询日志记录。无论您的 bootstrap/services 文件在哪里创建数据库连接,我都会在它之后添加:

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