下面的 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 一次載入它。