私は実際にMySQLデータベースに挿入したい100,000レコードのリストを持っています。
foreach
簡単に挿入してみましたINSERT INTO
が、100行でも挿入するのに時間がかかりました。1秒/行のように。
これらの行をはるかに速く挿入する方法はありますか?
複数の行で 1 つの INSERT ステートメントを使用する方が、行ごとに 1 つの INSERT ステートメントを使用するよりも高速です。これにより、データベースへの呼び出しが減少します。
例:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
パッケージを作成する:
INSERT INTO `table_name`(`column`) VALUES('value'),VALUES('value1'),VALUES('value2'), ..., VALUES('valuen');
または、データをcsvまたはその他のテキスト形式にエクスポートして使用LOAD DATA
します。こちらをご覧ください:mysqlクライアントによるデータの読み込み
複数のVALUESリストを含む1つの長いINSERTに複数の類似したINSERTをグループ化して、一度に複数の行を挿入します。接続+送信+クエリの解析には、実際のデータ挿入の5〜7倍かかるため、クエリは高速になります(行サイズによって異なります)。 。それが不可能な場合は、データベースがInnoDBの場合はSTART TRANSACTIONとCOMMITを使用し、それ以外の場合はLOCK TABLESを使用します。これにより、すべてのINSERTステートメントが完了した後にインデックスバッファーがディスクに1回だけフラッシュされるため、パフォーマンスが向上します。この場合、他のスレッドがテーブルにアクセスできるように、1000行程度ごとにテーブルのロックを解除します。
コマンドラインインターフェイスを使用する最速の方法。mysqldumputilを使用できます。
大規模なデータセットをロードする最速の方法は、バルクロードインターフェイスを使用することです。Mysqlドキュメントを参照してください:バルクローダー