问题描述
我正在尝试将旧版的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']."')");
下一个$ 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
->新项目(查询运行缓慢)
感谢您的时间。
编辑:我刚刚注意到MysqL的PDO驱动程序在版本之间是不同的
对于PHP 7.1:
- MysqLnd 5.0.12-dev-20150407-$ Id:38fea24f2847fa7519001be390c98ae0acafe387 $
对于PHP 7.4:
- MysqLnd 7.4.6
编辑2:查询处于事务中,并且使用相同的索引和相同的dB引擎,因为在同一服务器上同一数据库中同一表上的相同插入是相同的。代码没有任何变化,只有PHP版本。
解决方法
注释中没有明确提及,但是可能导致查询速度变慢的其他原因是查询记录。
默认情况下,Fat-Free将记录所有数据库查询。如果您正在运行大量的插入,则将记录所有这些插入。如果还没有,我建议在生产中禁用查询日志记录。无论您的bootstrap / services文件在哪里建立db连接,我都会在它后面添加:
$f3->set('db',new DB\SQL(/* config stuff */));
if(ENVIRONMENT === 'PRODUCTION') { // or whatever you use to signal it's production
$f3->db->log(false);
}