同样的mariaDB在PHP7.4中的插入速度比PHP7.1中的无脂插入速度慢得多
我正在尝试将一个遗留的PHP/Fat免费项目从PHP7.1迁移到7.4,我发现有些查询需要花费太长的时间(比如10倍多的时间)才能完成。特别是一些插页。我使用xampp(7.1.32和7.4.6)在本地主机上运行同一个项目,并使用完全相同的MariaDB服务器(v10.4.8)和完全相同的数据库 代码是这样的:同样的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->
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(与前一个服务器和数据库相同)
- mysqlnd 5.0.12-dev-20150407-$Id:38fea24f2847fa7519001be390c98ae0acafe387$
- 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版本。我会尝试缓存的方法。你必须提供更多的调试信息才能回答问题。一个像“哦,这个代码错了,我以后再修”,“哦,这里我忘了提”这样的问题根本不行。你甚至无法决定是“一些查询”还是“数百万”。