Maison >base de données >tutoriel mysql >Comment insérer des dizaines de millions de données dans une boucle MySQL

Comment insérer des dizaines de millions de données dans une boucle MySQL

WJ
WJoriginal
2020-06-03 16:36:574328parcourir

Comment insérer des dizaines de millions de données dans une boucle MySQL

Comment MySQL implémente-t-il l'insertion circulaire de dizaines de millions de données ?

1. Créez une table :

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. Créez une procédure stockée pour l'insertion de boucle

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 #

Utilisez l'appel test_two1(); Cela prend 74 secondes. S'il y a des dizaines de millions de données, cette vitesse sera insupportable.

J'ai donc cherché des méthodes d'optimisation sur Internet et j'ai découvert que je pouvais assembler des instructions SQL insérées par lots, et la vitesse était grandement améliorée

Procédure stockée optimisée

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;
L'appel de call insertPro(3000) prend quelques dixièmes de seconde, ce qui est acceptable.

a ensuite appelé

pour tester l'insertion de 30 millions de données, et le résultat a pris 1824,203 s (30 minutes). Cette vitesse d'un ordinateur personnel est très bien. call insertPro(30000000) ;

De plus, le multithreading Java est utilisé pour épisser SQL simultanément, et tous les 10 000 éléments sont soumis. Lorsque 8 threads s'exécutent en même temps, l'insertion de 30 millions de données prend 336 secondes. l'insertion de 100 millions de données prend 336 secondes 1087.

Références associées :

Tutoriel MySQL



Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn