Maison > base de données > tutoriel mysql > le corps du texte

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

WJ
Libérer: 2020-06-03 16:36:57
original
4265 Les gens l'ont consulté

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
Copier après la connexion

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 #
Copier après la connexion

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;
Copier après la connexion
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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!