데이터 100,000건 INSERT 테스트 — 다중 INSERT와 트랜잭션 조합
데이터 100,000건 INSERT 테스트를 해봄. 단건 INSERT vs 다중 INSERT, 그리고 autocommit 켠 상태 vs 트랜잭션 묶은 상태. 조합해서 4가지.
결과
| 방식 | 시간 |
|---|---|
| 단건 INSERT | 약 153~161초 |
| 다중 INSERT | 약 11.5~12초 |
| 트랜잭션 + 단건 INSERT | 약 15.3~16초 |
| 트랜잭션 + 다중 INSERT | 약 3.3~4초 |
-- 단건 INSERT
INSERT INTO table VALUES (1,2,3);
-- 다중 INSERT
INSERT INTO table VALUES (1,2,3),(3,4,5), ... ;
-- 트랜잭션 (autocommit = 0)
START TRANSACTION;
INSERT INTO table VALUES (1,2,3), ... ;
COMMIT;
단건으로 10만 번 날리면 153초. 다중 INSERT로 묶으면 12초. 트랜잭션까지 묶으면 3.3초. 최종적으로 40배 이상 차이 남.
솔직히 트랜잭션을 쓰면 다중 INSERT를 하나 안 하나 큰 차이 없을 줄 알았는데 차이가 심했음. 트랜잭션은 커밋 비용을 줄여주는 거고, 다중 INSERT는 쿼리 파싱·네트워크 왕복을 줄여주는 거라 서로 다른 데서 이득을 봄. 그래서 둘을 겹치면 또 줄어드는 거.
PHP PDO 메모
PHP는 $pdo->beginTransaction()을 실행하면 트랜잭션 모드가 됨. autocommit이 자동으로 false로 바뀌면서 트랜잭션 안에서 쿼리가 돎. commit() 하기 전까지 반영 안 됨.
$pdo->beginTransaction();
// INSERT 반복
$pdo->commit();
다음에 테스트해볼 것
유니크 키 같은 제약조건은 INSERT마다 if 문 쓰듯 체크가 도니까, 대량 INSERT 전에 제약조건을 먼저 풀고 넣은 다음 다시 걸어주면 더 빠르다고 함. 나중에 한번 테스트해봐야겠음.
정리
- 대량 INSERT는 다중 INSERT + 트랜잭션 조합이 답. 10만 건 기준 153초 → 3.3초.
- 트랜잭션은 커밋 비용, 다중 INSERT는 파싱·왕복 비용. 이득 보는 지점이 달라서 겹치면 더 빠름.
- PDO는
beginTransaction()하나로 autocommit 꺼짐.