下面的 PHP 脚本目前托管在 c3.large EC2 实例上,该实例具有实例存储以及用于 MySQL 的 SSD 安装。脚本正在读取的文件位于其中一个实例存储设备上。
当脚本首次启动时,它会像预期的那样以 100% 的速度运行,但是,几个小时后,脚本的速度会减慢到 5% 左右,最终导致 MySQL 插入速度变得非常慢。
有什么想法可以减慢这个过程吗?这可能是 IOPS 问题吗?
$handle = fopen(TMP . 'zones/' . $destinationFile, 'r');
if ($handle) {
$x = 0;
$origin = '';
while (($line = fgets($handle)) !== false) {
$x = $x + 1;
$line = str_replace("\r", '', $line);
$line = str_replace("\n", '', $line);
if ($x > 61) {
$record = explode(' ', $line);
switch ($record[1]) {
case 'NS':
$domain = $record[0];
$nameserver = rtrim($record[2], '.');
if ($record[2] == $nameserver) {
$nameserver = $nameserver . '.' . $origin;
}
$domainId = $this->addDomain($domain, $origin);
$nameserverId = $this->addNameserver($nameserver);
$dnId = $this->addDomainNameserver($domainId, $nameserverId);
break;
case 'A':
echo 'Nameserver IP: ' . $record[2];
break;
}
} else {
if (strpos($line, '$ORIGIN') > -1) {
$origin = str_replace('$ORIGIN ', '', $line);
$origin = rtrim($origin, '.');
}
}
}
fclose($handle);
}
答案1
最好在 StackOverflow 上提问... 您提到了 MySQL 插入,但我没有在您的问题中看到任何 SQL 代码。通常,当您在数据库中插入大量数据时:
1) 您不会对每一行都执行一个请求 2) 您时不时地提交,否则数据库必须将所有数据保存在临时缓冲区中。 3) 但您也不会对每一行都提交,因为这很昂贵,通常您会按几千行的批次输入数据。
此外,MySQL 和其他 DBMS 也有办法从文件中提取大型表(参见LOAD DATA
在 SQL 中或mysqlimport
命令),这样您的脚本就可以创建该中间文件,然后调用 MySQL 一次性加载它。