#mysql は、数千万のデータの循環挿入をどのように実装するのでしょうか?
1. テーブルの作成:
CREATE TABLE `mysql_genarate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uuid` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5990001 DEFAULT CHARSET=utf8
2. ループ挿入用のストアド プロシージャの作成
create procedure test_two1() begin declare i int default 0; while i < 3000 do INSERT into mysql_genarate(uuid) VALUES(UUID()); set i = i + 1; end while; end #
call test_two1(); を使用してテスト、3000 データ消費74秒かかるので、数千万件のデータがあるとこの速度は耐えられないでしょう。
そこで、インターネットで最適化方法を探したところ、バッチ挿入された SQL ステートメントを結合できることがわかり、速度が大幅に向上しました;
3. 最適化されたストアド プロシージャ
CREATE PROCEDURE insertPro(in sum INT)BEGINDECLARE count INT DEFAULT 0;DECLARE i INT DEFAULT 0; set @exesql = concat("insert into mysql_genarate(uuid) values"); set @exedata = ""; set count=0; set i=0;while count<sum do set @exedata = concat(@exedata, ",(UUID())"); set count=count+1; set i=i+1; if i%1000=0 then set @exedata = SUBSTRING(@exedata, 2); set @exesql = concat("insert into mysql_genarate(uuid) values ", @exedata); prepare stmt from @exesql; execute stmt; DEALLOCATE prepare stmt; set @exedata = ""; end if;end while;if length(@exedata)>0 then set @exedata = SUBSTRING(@exedata, 2); set @exesql = concat("insert into mysql_genarate(uuid) values ", @exedata); prepare stmt from @exesql; execute stmt; DEALLOCATE prepare stmt;end if;end;
call insertPro(3000) の呼び出しには数十分 1 秒かかりますが、許容範囲内です。
次に、call insertPro(30000000);
を呼び出し、3,000 万個のデータ挿入をテストします。結果は 1824.203 秒 (30 分) です。パソコンの速度はこれくらいで大丈夫です。
さらに、Java マルチスレッドを使用して SQL を同時に結合し、10,000 項目ごとに送信すると、8 つのスレッドが同時に実行されている場合、3,000 万個のデータを挿入するのに 336 秒かかり、3,000 万個のデータを挿入するのに 336 秒かかります。 1 億個のデータを挿入するには 1087 秒。
関連参照:MySQL チュートリアル
以上がmysql ループに数千万のデータを挿入する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。