与 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.
中花费更多时间
这是我的设置
->原始项目(其中查询 运行 很好)
- PHP7.1.32(内存限制2048mb)
- 无脂肪 3.6.4
- MariaDB 10.4.8
->新建项目(其中查询运行慢)
- PHP7.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:
- 我的sql和 7.4.6
编辑 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);
}
我正在尝试将遗留 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.
中花费更多时间这是我的设置
->原始项目(其中查询 运行 很好)
- PHP7.1.32(内存限制2048mb)
- 无脂肪 3.6.4
- MariaDB 10.4.8
->新建项目(其中查询运行慢)
- PHP7.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:
- 我的sql和 7.4.6
编辑 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);
}