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 #
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;
는 insertPro(3000)를 호출합니다. 10분의 1초 정도의 속도는 허용됩니다.
그런 다음 call insertPro(30000000) ;
를 호출하여 3천만 개의 데이터 삽입을 테스트해 본 결과 1824.203s(30분)가 소요되었습니다. 개인용 컴퓨터의 속도는 괜찮습니다.
또한 Java 멀티스레딩을 사용하여 SQL을 동시에 연결하고 10,000개 항목마다 제출하며 동시에 8개의 스레드를 실행하여 3천만 개의 데이터를 삽입하는 데 336초가 걸리고 1억 개의 데이터를 삽입하는 데 시간이 걸립니다. 1087초가 걸립니다.
관련 참조: MySQL Tutorial
위 내용은 mysql 루프에 수천만 개의 데이터를 삽입하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!