行ごとに値が異なるフィールドINSERT
を除いて、まったく同じ行を複数回実行する必要があります。PHPで同じ行にループrecipient
を実行するのではなく、反復ごとにフィールドを変更しますが、MySQLでこれをより効率的に実行する方法はありますか?for/each
INSERT
recipient
3 に答える
いくつかのオプションがあります。しかし、効率が得られるかどうかは、ベンチマークする必要があります。
方法 1: 最初にすべての行を 1 つのバッチに挿入してから、2 番目のループで更新クエリを実行します。
2 番目の一連の更新クエリを実行しようとすると効率が失われるため、このアプローチは好きではありません。
ただし、PHP を使用してクエリを実行する予定なので、方法 2 をお勧めします。
方法 2:
複数の挿入値を含む文字列を作成します。
Insert into MyTable (Field1, Field2, ... Field-N) Values (Value1, Value2, Value3, ... Value-N), (Value1, Value2, Value3, ... Value-N), (Value1, Value2 、Value3、... Value-N)
ここで文字列をかなりのサイズに構築できます。過去に10,000レコード用に構築しました。
mysql_query関数を呼び出してクエリを実行します。
挿入するレコードがなくなるまで、手順 1 に戻ります。
この方法は、大量の挿入がある場合に非常に適しています。ただし、正しいレコードが挿入されるようにするには、挿入の失敗をトラップする必要があることに注意してください。理想的には、 mysql_affected_rows関数と共にトランザクション コミットがこれを解決するのに役立ちます。
最後に、数があまり多くない場合は、より小さな文字列を作成します。総レコード数が約 50 程度の場合は、個別に挿入します。
stored procedure
単一のクエリ呼び出しを使用して、同じテーブルに複数の挿入を行うために MySQL にa を記述できると思います。例えば
CREATE PROCEDURE sp_insert_data
(
arg_col VARCHAR(255)
,arg_recipient_val_1 VARCHAR(255)
,arg_recipient_val_2 VARCHAR(255)
)
BEGIN
INSERT INTO my_table(col, recipient)
VALUES(arg_col, arg_recipient_val_1),
(arg_col, arg_recipient_val_2);
END;
ここのリンクをよく読む必要があると思います。同時に複数の行を挿入できます。これにより、変数の再利用が非常に簡単になります。
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
いくつかのトリックがあります。
- まず、テーブルをロックして挿入プロセスを高速化します。
- 次に、複数の挿入構文を使用して行をすばやく挿入できます。
以下に SQL コードの例を示します。
LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
...
UNLOCK TABLES;
SQL の効率に関して言えば、 replace into構文を調べないでください。
REPLACE INTO は、UPDATE ステートメントよりもパフォーマンスがはるかに遅いことに注意してください。REPLACE INTO にはキーのテストが必要であり、一致する一意のキーがいずれかまたはすべての列で見つかった場合、DELETE FROM が実行され、次に INSERT が実行されることに注意してください。これには多くの行の管理が含まれます。これを頻繁に行うと、他の構文ではできない場合を除いて、パフォーマンスが低下します。