>  기사  >  데이터 베이스  >  mysql 루프에 수천만 개의 데이터를 삽입하는 방법

mysql 루프에 수천만 개의 데이터를 삽입하는 방법

WJ
WJ원래의
2020-06-03 16:36:574309검색

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 #

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.