INSERT
일반적인 애플리케이션 서비스에서는 INSERT 할 때 대부분 한 건 혹은 소량의 레코드만 추가하는 형태인데, 이 경우엔 성능에 대해 고려할 부분이 없다.
삽입 옵션
섹션 제목: “삽입 옵션”INSERT IGNORE: 중복된 레코드(UNIQUE 컬럼)가 있을 경우, 오류를 발생시키지 않고 무시하고 다음 레코드로 넘어가는 옵션- 데이터의 정교함이 덜 요구되는 대량 데이터 적재 시, 중복 오류로 인해 전체 작업이 중단되는 것을 방지하기 위해 사용
INSERT ... ON DUPLICATE KEY UPDATE: 중복된 레코드(UNIQUE 컬럼)가 있을 경우, 오류를 발생시키지 않고 해당 레코드를 UPDATE하는 옵션- INSERT와 UPDATE를 하나의 쿼리로 처리할 수 있어 애플리케이션 로직을 단순화하는 데 유용
LOAD DATA
섹션 제목: “LOAD DATA”LOAD DATA 명령어는 대용량 텍스트 파일을 테이블에 고속으로 적재하기 위한 전용 구문이다.
- MySQL 엔진과 스토리지 엔진 호출 횟수를 최소화
- 스토리지 엔진 레벨에서 직접 데이터를 적재
하지만 LOAD DATA 명령을 사용할 때 주의할 점이 있다.
- 단일 스레드 동작: 데이터를 적재하는 작업이 단일 스레드로만 처리
- 단일 트랜잭션 실행: 파일 전체가 하나의 트랜잭션으로 묶여 실행
따라서 매우 큰 파일을 적재할 경우, 장시간 동안 테이블에 잠금이 발생하여 다른 트랜잭션의 성능에 영향을 줄 수 있다.
INSERT 성능에 영향을 미치는 요소
섹션 제목: “INSERT 성능에 영향을 미치는 요소”프라이머리 키(Primary Key) 특성
섹션 제목: “프라이머리 키(Primary Key) 특성”INSERT 쿼리 자체보다는 테이블의 구조, 특히 프라이머리 키(Primary Key)의 특성이 성능에 결정적인 영향을 미친다.
- 순차적 PK(예:
AUTO_INCREMENT): 새로운 데이터가 항상 테이블의 마지막에 추가- 디스크에 순차적으로 쓰기 작업을 수행하게 만들어 높은 성능을 유지
- 비순차적 PK(예: UUID): 새로운 데이터가 테이블의 중간 여러 위치에 삽입
- 해당 과정에서 기존 데이터 페이지를 찾아가고, 공간이 부족할 경우 페이지 분할(Page Split)을 일으켜 심각한 성능 저하 유발
- 페이지 분할은 많은 랜덤 디스크 I/O를 발생시키고 데이터 파편화 증가
다중 행 INSERT(Multi-row INSERT)
섹션 제목: “다중 행 INSERT(Multi-row INSERT)”여러 건의 데이터를 INSERT할 때는 한 건씩 반복 실행하는 것보다, 하나의 INSERT 문에 여러 VALUES 절을 포함하여 실행하는 것이 훨씬 효율적이다.
-- 비효율적인 방식INSERT INTO users (name)VALUES ('user1');INSERT INTO users (name)VALUES ('user2');
-- 효율적인 방식INSERT INTO users (name)VALUES ('user1'), ('user2');하나의 INSERT 문에 여러 행을 포함하면, 네트워크 왕복 횟수, 쿼리 파싱 및 계획 수립 오버헤드, 트랜잭션 커밋 오버헤드가 크게 줄어들어 성능이 향상된다.