MySQL에서 다수의 행을 한 번에 삽입할 때 가장 빠른 방법은 INSERT INTO 문을 단 한 번만 실행하고, 여러 개의 값 그룹을 쉼표로 구분하여 하나의 쿼리로 처리하는 것입니다. 이 방식은 행마다 INSERT 문을 반복 실행하는 것보다 네트워크 오버헤드와 파싱 비용을 크게 줄여주는 최적화된 기법입니다.
최적화된 INSERT 문 기본 문법
insert into yourTableName values(NULL,'yourValue1','yourValue2'),(NULL,'yourValue1','yourValue2'),....N;
위 문법처럼 AUTO_INCREMENT 컬럼에는 NULL을 전달하면 MySQL이 자동으로 고유 ID를 생성해 줍니다.
예제 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1839 ( ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY, ClientName varchar(20), ClientAge int ); Query OK, 0 rows affected (0.00 sec)
단일 INSERT 문으로 여러 행 삽입하기
insert 명령을 사용해 여러 레코드를 한 번에 삽입합니다. 아래 예제에서는 하나의 INSERT 문으로 8개의 행을 동시에 추가했습니다.
mysql> insert into DemoTable1839 values(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29),(NULL,'Chris',29); Query OK, 8 rows affected (0.00 sec) Records: 8 Duplicates: 0 Warnings: 0
삽입된 데이터 확인하기
select 문으로 테이블의 모든 레코드를 조회하여 정상적으로 삽입되었는지 확인합니다.
mysql> select * from DemoTable1839;
실행 결과는 다음과 같습니다.
+----------+------------+-----------+ | ClientId | ClientName | ClientAge | +----------+------------+-----------+ | 1 | Chris | 29 | | 2 | Chris | 29 | | 3 | Chris | 29 | | 4 | Chris | 29 | | 5 | Chris | 29 | | 6 | Chris | 29 | | 7 | Chris | 29 | | 8 | Chris | 29 | +----------+------------+-----------+ 8 rows in set (0.00 sec)
왜 이 방법이 더 빠를까?
각 행마다 별도의 INSERT 문을 실행하면 매번 쿼리 파싱과 서버 왕복 통신이 발생합니다. 반면 하나의 INSERT 문에 여러 값을 묶어서 실행하면 이 과정이 단 한 번만 일어나기 때문에, 특히 수천~수백만 건의 대량 데이터를 삽입할 때 성능 차이가 매우 큽니다. 추가로 max_allowed_packet 설정값을 적절히 조정하면 더 많은 행을 한 번에 처리할 수 있습니다.