gpt4 book ai didi

php - 为什么 apache2 服务器最多需要 1.5 小时才能写入 6 mb .sql 文件

转载 作者:行者123 更新时间:2023-11-29 03:31:46 25 4
gpt4 key购买 nike

我有一个脚本,它读取一个包含 3mb 数据的文本文件并写入一个 .sql 文件进行导入。

此文本文件全天每 1 小时从第三方上传到应用程序。

问题是这个脚本在我的本地电脑上完成不到 1 分钟。但是当脚本在生产服务器(具有 4GB 内存、2 核处理器的专用服务器)上运行时,最多需要 1.5 小时。该脚本过去在同一环境中运行不到 5 分钟。

文本文件被压缩成一个 .gz 文件,所以我使用 gzopen 打开文件并使用 fgets 循环文件并创建一个 sql 字符串来写入.sql 文件(以下是从文本文件创建的字符串)

'INSERT INTO `table` (`col_1`,`col_2`,`col_3`,`col_4`,`col_5`,`col_6`,`col_7`,`col_8`,`col_9`,`col_10`,`col_11`,`col_12`,`col_13`,`col_14`,`col_15`,`col_16`) 
VALUES
("'.implode('","',
array(
mysqli_real_escape_string($this->ds,$trackNo),
mysqli_real_escape_string($this->ds,$ln[1]),
$dateReceived,
mysqli_real_escape_string($this->ds,$ln[2]),
$dateDelevered,
mysqli_real_escape_string($this->ds,$ln[3]),
mysqli_real_escape_string($this->ds,$ln[4]),
mysqli_real_escape_string($this->ds,$ln[5]),
mysqli_real_escape_string($this->ds,$ln[7]),
mysqli_real_escape_string($this->ds,$ln[8]),
mysqli_real_escape_string($this->ds,$ln[9]),
date(DATE_ISO8601,time()),
date(DATE_ISO8601,time()),
'system',
mysqli_real_escape_string($this->ds,$ln[4]),
'txt.gz'))
.'");'

这个字符串将被逐行写入.sql文件,直到fgets结束使用fwrite

我不明白为什么这个过程需要这么长时间,因为在我的电脑上它在 2 分钟内完成

最佳答案

您可能有默认的 innodb_flush_log_at_trx_commit = 1; =2 将运行得更快,因为它不会在每次插入后刷新。

另一种方法是“批处理”INSERT。构建 INSERT ... VALUES (...), (...), ... 的运行速度将提高 10 倍。我建议批量为 100 到 1000。

1GB 的 RAM 以今天的标准来看很小。我希望你没有大于 100M 的 innodb_buffer_pool_size。 buffer_pool 太大可能会导致交换,这对性能非常不利。

关于php - 为什么 apache2 服务器最多需要 1.5 小时才能写入 6 mb .sql 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com