ホームページ  >  記事  >  データベース  >  mysql ループに数千万のデータを挿入する方法

mysql ループに数千万のデータを挿入する方法

WJ
WJオリジナル
2020-06-03 16:36:574323ブラウズ

mysql ループに数千万のデータを挿入する方法

#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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。