일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- ncloud
- postgresql
- InnoDB
- Maria
- slack
- zabbix
- percona
- RDBMS
- 6.2.7
- Docker
- mysql
- REDIS
- jmeter
- mongo
- DELETE
- opensource
- online ddl
- maxclients
- RDS
- NCP
- OD
- MyISAM
- NOSQL
- 성능테스트
- vacuum
- cdb
- DML
- Connection
- Cloud DB for MySQL
- autovacuum
- Today
- Total
개인 공부
Bulk Insert시 Auto Increment Table 이슈 본문
MySQL에서 Bulk Insert(Load Data Infile, Insert into Select~ )을 사용해 대량으로 데이터를 삽입할 때, 종종 테이블의 AUTO_INCREMENT 값이 실제 삽입된 데이터보다 훨씬 커지는 현상이 발생합니다. 이는 의도된 동작이며, MySQL의 AUTO_INCREMENT 동작 방식과 관련이 있습니다.
문제 상황 예시
테이블에 auto_increment 컬럼이 존재 할때 Bulk Insert를 통해 데이터를 인서트할 경우 발생하게 된다.
원인: innodb_autoinc_lock_mode 설정
MySQL에서 AUTO_INCREMENT 값의 증가 방식은 innodb_autoinc_lock_mode 설정에 따라 다르게 동작합니다.
mode는 총 3개로 나뉘어져 있다.
0 (traditional) : 테이블 전체 잠금. 각 INSERT가 순차적으로 수행되어 ID가 정확히 맞지만 성능 저하
1 ( consecutive) : 기본값으로 INSERT INTO ... VALUES는 순차 삽입, LOAD DATA INFILE 등 대량 삽입은 인터리브처럼 동작 가능
2 (interleaved) : 병렬 실행 허용, 성능 좋음. 대신 AUTO_INCREMENT 값이 중간에 "튀는" 현상 발생 가능
MySQL 공식 문서 요약
When "bulk inserts" are executed, there may be gaps in the auto-increment values assigned by any given statement.
대량 삽입이 실행되면, 해당 문장에 의해 할당된 AUTO_INCREMENT 값에는 공백이 생길 수 있다.
이 현상이 발생하는 명령어들
다음과 같은 대량 삽입 계열 명령어는 모두 비슷한 AUTO_INCREMENT 튀는 현상을 유발할 수 있습니다.
- LOAD DATA INFILE
- INSERT INTO ... SELECT
- INSERT INTO ... VALUES (...), (...), (...) (멀티 로우 삽입)
나의 경우 아래 2가지를 통해서 인서트를 진행하였다.
1. 서비스 중인 테이블이 아닌 경우 Bulk Insert 이후 Alter Table로 auto_increment 값 수정
2. 서비스 중이라면 Bulk Insert 사용하지 않고 Auto commit 비활성화, 단일 데이터 Insert, Commit 순으로 진행하였다.
'MySQL & Maria' 카테고리의 다른 글
pt-online-schema-change를 사용한 테이블 데이터 정리 방법 (0) | 2025.05.03 |
---|---|
log_slow_extra (0) | 2025.03.09 |
[ DML ] Rollback 시간 산정 (0) | 2025.01.03 |
AND / OR 논리 연산자 우선 순위 (0) | 2023.12.08 |
[ MySQL ] MyISAM to InnoDB (14) | 2023.05.26 |