5

そのため、データベースに 250,000 行を挿入しようとしています。これは単なるサンプル データであるため、変化する ax、y 変数を照会する必要があるだけです。つまり、for ループと単に「水」である地形だけです。

しかし、これには永遠に時間がかかります。これをより速く行う方法を知っている人はいますか?

ini_set('max_execution_time', 70000);

$conn = mysql_connect('localhost', 'root', '') or die(mysql_error());
mysql_select_db('hol', $conn) or die(mysql_error());

for ($y=0;$y<500;$y++) {
    for ($x=0;$x<500;$x++) {
        mysql_query("INSERT INTO map(x, y, terrain) VALUES($x, $y, 'water')");
    }
}
4

4 に答える 4

8

MySQL LOAD DATA FROM INFILE ステートメントを使用した方がよい場合があります。一括読み込みは、大規模な挿入ステートメント文字列を構築するよりも高速になる傾向があります。データをファイルに書き込み、単一の LOAD を実行します。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

挿入/ロードは、テーブルのインデックスの数にも依存します。必要な列にのみ索引を作成します。また、多くの場合、データをテーブルにロードした後にインデックスを追加して、データの追加中にインデックスを更新しないようにすることで、パフォーマンスが向上します。

于 2012-06-10T21:10:01.117 に答える
3
INSERT INTO map (x, y, terrain) 
 VALUES ($x, $y, 'water'), ($x, $y, 'water') [etc]

したがって、必要なクエリは 1 つだけです。

もちろん、400〜500の値を追加した場合は、クエリを複数のクエリに分割します

于 2012-06-10T21:10:15.123 に答える
2

これらの 250.000 を自動コミット モード (250.000 トランザクション) で実行していないことを確認する必要があります。

それらすべてを 1 つのトランザクションで送信することにより、mysql エンジンがそのトランザクション メカニズムを 250.000 回呼び出す必要がないため、処理がかなり高速化されます。

cf PHP + MySQL トランザクションの例

mysql_query("START TRANSACTION");
... your requests
mysql_query("COMMIT");

インデックスの状態を気にしない場合は、トランザクションを開始する前にテーブルにあるインデックスを削除し、後で再作成する必要があります。これにより、エンジンが単一性をチェックしたり、インデックスを更新したりする必要がなくなるため、処理が大幅に高速化されます。行ごとに..

于 2012-06-10T21:15:03.933 に答える
0

明らかに、最初のステートメントには 500 個の値しかないため、値を挿入する方法はそれほど重要ではなく、ループを使用してこれを行うことができます。

INSERT INTO temp500 (value)
  VALUES (0), (1), (2), ... (499);
INSERT INTO map (x, y, terrain)
  SELECT x.value, y.value, 'water'
    FROM temp500 x, temp500 y;
于 2012-06-10T21:30:14.220 に答える