私はjsonデータをmysql.My jsonファイルに3.7Mb近づけようとしていますが、17k行(テストデータの実際のデータは65k行になります)です。スクリプトは非常に遅く、ほぼ8〜9分です。そこにPHPの進捗インターフェイスでmysqlにjsonデータをインポートするための速い方法はありますか? そして、私はプログレスバーの機能とその作品を今のところ追加しようとしています。大きなJsonデータをmysql
$veri=json_decode(file_get_contents('auctions.json'));
$sayi=count($veri->alliance->auctions);
$a=$veri->alliance->auctions;
$yuzde=round($sayi/100);
echo "<div id='tasiyici'>";
$sql=$db->prepare("INSERT INTO auctions (id, auc, item, owner, bid, buyout, quantity, timeLeft) VALUES ('',?,?,?,?,?,?,?)");
for ($i=0;$i<=$sayi;$i++){
$sql->execute(array($a[$i]->auc,$a[$i]->item,$a[$i]->owner,$a[$i]->bid,$a[$i]->buyout,$a[$i]->quantity,$a[$i]->timeLeft));
if($i%$yuzde=='0'){
$y=$i/$yuzde;
if(($y*4+4)>"180"){$pos=40-(($y*4+4)-180); $color="color:#fff";}
if(($y*4+4)>=220){$pos=0;}
echo "<div class='rakam' style='background-position:-".$pos."px 0;".$color."'>%".($y+1)."</div>";
echo "<div class='yuzde' style='width:".($y*4+4)."px;'></div>";
ob_flush();
flush();
}
}
echo "</div>";
echo "<br> $sayi data added.";
CSSコード
<style>
body {
font-family:Arial;
}
#tasiyici {
width:400px;
height:17px;
display: block;
position: relative;
margin:50px auto;
background:#e3e3e3;
border-radius:5px;
overflow: hidden;
border:1px solid #ccc;
}
.yuzde {
height:17px;
display: block;
width:1px;
background:url("progressOverlay.png");
position: absolute;
top:0;
left:0;
z-index:1;
}
.rakam {
width:40px;
height:16px;
display: block;
line-height:17px;
position: absolute;
left:50%;
top:0;
margin-left:-20px;
z-index:9999;
background:url("progressOverlay.png") -40px 0 #e3e3e3 no-repeat;
font-size:11px;
}
</style>
実行ごとに複数の行を挿入できますが、準備された文と大きく異なる場合は懐疑的です。私はあなたのデータの少なくとも1%を実行ごとに挿入しようとします。 INSERT INTOを再利用することは、あなたのボトルネックがデータの量であるので大きな違いはありません。もう1つの方法は、JSONデータを変換し、http://stackoverflow.com/questions/2811096/mysql-bulk-insert-from-csv-data-files – Basti
のように一括インポートすることです。「$ sayi」は65,000になる可能性がありますか?それが事実なら、実行中のクエリは65,000件になります。代わりに、100または1,000のバッチでクエリを実行してみてください。私は準備/実行でそれを行う方法がわかりませんが、 'テーブル(キー)の値(値)、(値)、(値)...などに挿入し、あなたが100か1000か何かを得てからそれを実行するまで)より少ないmysql接続があるので(あなたの設定に応じて)少し速くなければなりません。 1000のバッチは65のクエリにそれを切り捨てます – Benno
ありがとう皆私は1つのクエリのために1000行を試してみます。私は結果をここに追加します。 – xuma