MySQL에서 여러 개의 레코드를 동시에 삽입할 때는 다음과 같은 문법을 사용하면 INSERT 작업 속도를 크게 높일 수 있습니다.
START TRANSACTION insert into insertDemo(yourColumnName1,yourColumnName2,...N) values(yourValue1,yourValue2,....N),(yourValue1,yourValue2,....N),.......N commit
핵심 원리: 기본 설정(autocommit 모드)에서는 INSERT 문 하나하나마다 디스크에 로그를 기록하고 동기화하는 작업이 반복되어 속도가 느려집니다. 반면 START TRANSACTION으로 여러 삽입 작업을 하나의 트랜잭션으로 묶고 마지막에 commit을 한 번만 실행하면 디스크 동기화 횟수가 크게 줄어들어 전체 처리 속도가 향상됩니다.
1단계: 데모 테이블 생성
먼저 실습에 사용할 데모 테이블을 만들어 보겠습니다.
mysql> create table insertDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName varchar(20),
-> StudentAge int
-> );
Query OK, 0 rows affected (0.72 sec)StudentId는 AUTO_INCREMENT로 설정되어 있어 데이터 삽입 시 번호가 자동으로 부여됩니다.
2단계: 여러 레코드 한 번에 삽입
트랜잭션을 시작한 뒤, VALUES 절에 여러 행의 값을 나열하여 6개의 레코드를 한 번에 삽입합니다.
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into insertDemo(StudentName,StudentAge) values('John',21),('Carol',22),('Bob',21),('David',24),
-> ('Maxwell',25),('Mike',22);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.14 sec)실행 결과를 보면 6개의 레코드가 단 한 번의 INSERT 문으로 성공적으로 삽입된 것을 확인할 수 있습니다.
3단계: 결과 확인
SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from insertDemo;
다음은 실행 결과입니다.
+-----------+-------------+------------+ | StudentId | StudentName | StudentAge | +-----------+-------------+------------+ | 1 | John | 21 | | 2 | Carol | 22 | | 3 | Bob | 21 | | 4 | David | 24 | | 5 | Maxwell | 25 | | 6 | Mike | 22 | +-----------+-------------+------------+ 6 rows in set (0.00 sec)
AUTO_INCREMENT가 적용된 StudentId 컬럼에는 1부터 순차적인 번호가 자동으로 부여되었으며, 모든 데이터가 정상적으로 저장된 것을 확인할 수 있습니다. 대량의 데이터를 삽입할 때는 이처럼 트랜잭션으로 묶어 처리하면 성능을 효과적으로 개선할 수 있습니다.