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;
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) ;
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!