毎日、xml から mysql に大きなデータを挿入する必要があり、このジョブを cron ジョブで実行していますが、すべてのデータを DB に挿入するのに約 2 時間かかります。
その時間を短縮する方法はありますか?
これが私のコードです:
meekroDB を使用して挿入します
私の最初のコードは(かなり単純です):
for ($i = 0; $i <= count($xml->Table);$i++) {
DB::insert($PreFix."_stock", array(
'refid' => (string)$xml->Table[$i]->refid,
'articulo' => (string)$xml->Table[$i]->articulo,
'modelo' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->modelo),
'metadatos' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->metadatos),
'estado' => (string)$xml->Table[$i]->estado,
'reffab1' => (string)$xml->Table[$i]->reffab1,
'reffab2' => (string)$xml->Table[$i]->reffab2,
'refequiv' => (string)$xml->Table[$i]->refequiv,
'nota' => str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->nota),
'precio' => (string)$xml->Table[$i]->precio,
'numfotos' => (string)$xml->Table[$i]->numfotos,
'fechamod' => (string)$xml->Table[$i]->fechamod,
'idarticulo' => (string)$xml->Table[$i]->idarticulo,
'idversion' => (string)$xml->Table[$i]->idversion
));
だから私の質問は:86k行を挿入するのに長い時間がかかるのは普通ですか、それとも最善の方法はありますか?
meekroDB でテストを開始する前に、このコードを書きましたが、常にタイムアウトしていました。
for ($i = 0; $i <= count($xml->Table);$i++) {
$VALUES[] = "( '".
(string)$xml->Table[$i]->refid."' , '".
(string)$xml->Table[$i]->articulo."' , '".
str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->modelo)."' , '".
str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->metadatos)."' , '".
(string)$xml->Table[$i]->estado."' , '".
(string)$xml->Table[$i]->reffab1."' , '".
(string)$xml->Table[$i]->reffab2."' , '".
(string)$xml->Table[$i]->refequiv."' , '".
str_replace($lessCharMeta,$lessCharMeta2,(string)$xml->Table[$i]->nota)."' , '".
(string)$xml->Table[$i]->precio."' , '".
(string)$xml->Table[$i]->numfotos."' , '".
(string)$xml->Table[$i]->fechamod."' , '".
(string)$xml->Table[$i]->idarticulo."' , '".
(string)$xml->Table[$i]->idversion."' )";
}
$stmt = $mysqli->prepare(
"CREATE TABLE IF NOT EXISTS ".$PreFix."_stock(ID int(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`refid` VARCHAR(10),
`articulo` VARCHAR(200),
`modelo` VARCHAR(16),
`metadatos` VARCHAR(500),
`estado` VARCHAR(100),
`reffab1` VARCHAR(50),
`reffab2` VARCHAR(50),
`refequiv` VARCHAR(50),
`nota` VARCHAR(200),
`precio` VARCHAR(15),
`numfotos` VARCHAR(2),
`fechamod` VARCHAR(50),
`idarticulo` VARCHAR(10),
`idversion` VARCHAR(10) )"
);
$stmt->execute();
$stmt->close();
$temp = "";
foreach ($VALUES as $KEY){
if (!empty($KEY)){
$temp = $temp." , ".$KEY;}
}
$sentencia = "
INSERT INTO ".$PreFix."_stock
(refid,articulo,modelo,metadatos,estado,reffab1,reffab2,refequiv,nota,precio,numfotos,fechamod,idarticulo,idversion)
VALUES
";
if ($stmt = $mysqli->prepare($sentencia.$temp) ){
$stmt->execute();
$stmt->close();
}
else {
printf("Errormessage: %s\n", $mysqli->error."<hr/>");
}
次に、post データで for ループ インデックスを送信して、500 回の挿入ごとに何度も同じスクリプトにジャンプすることにしましたが、cron ジョブを設定して作業を実行すると、スクリプトを飛び越えることはありませんでした。
meekroDB では少し遅いですが、PHP がタイムアウトすることはありません