[MySQL] Optimization for INSERT Query

Roy·2024년 1월 19일
0

Real MySQL 8.0

목록 보기
5/8

INSERT Query는 쿼리 튜닝으로 성능 향상이 어려운 편이다.
하지만, INSERT 대상이 되는 데이터나 테이블의 상태에 따라 달라질 수 있다.

1. INSERT하는 데이터의 특성

INSERT하는 데이터의 Primary Key가 정렬된 상태이어야 한다.
INSERT하는 데이터들이 Primary Key가 정렬돼있는 경우와 그렇지 않은 경우 성능에서 차이를 보인다.

# Primary Key로 정렬된 경우
LOAD DATA INFILE 'sorted_by_primary.csv'
    INTO TABLE salaries
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';

# output
Query OK, 3412754 rows affected (2 min 21.04 sec)

# Primary Key로 정렬되지 않은 경우
LOAD DATA INFILE '/tmp/sorted_by_random.csv'
    INTO TABLE salaries
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n';

# output
Query OK, 3412754 rows affected (7 min 9.04 sec)

2. INSERT하는 테이블의 특성

위에서 살펴본 것처럼, INSERT 성능을 결정하는 중요한 요소는 Primary Key다.
INSERT할 레코드의 Primary Key가 테이블의 Primary Key 순서와 무관하다면,
MySQL 서버는 INSERT를 실행할 때마다 레코드가 저장될 위치를 찾아야 한다.
Primary Key의 B-Tree 전체가 메모리에 적재돼 있어야 빠른 INSERT를 보장할 수 있다.

InnoDB 스토리지 엔진을 사용하는 테이블의 Primary Key는 Clustering Key이다.
그래서 Secondary Index를 이용하는 SELECT 쿼리보다 Primary Key를 이용하는 SELECT 쿼리의 성능이 훨씬 빠르다.

Primary Key는 단순히 INSERT 성능만을 위해 설계해선 안된다.
Primary Key를 선정할 때, "INSERT 성능"과 "SELECT 성능" 중에서 무엇이 더 중요한 지 고려해야 한다.
특정 테이블에서 읽기 쿼리와 쓰기 쿼리 중에 어떤 쿼리가 더 많이 쓰일지 생각해야 한다.

SELECT 쿼리가 빈번한 테이블에선 SELECT 쿼리의 성능을 최적화하는 방향으로 Primary Key를 설정해야 한다.
상품, 주문, 사용자 정보를 저장하는 테이블들이 주로 읽기 쿼리가 자주 발생한다.

INSERT 쿼리가 많이 발생하는 테이블에선 Primary Key를 단조 증가/단조 감소하는 패턴의 값으로 선택하는 것이 좋다.
또 인덱스의 개수를 최소화하는 것이 좋다.

요약하자면,
Primary Key를 Auto increment 혹은 Auto decrement 값으로 사용하고, 세컨더리 인덱스를 최소화하는 것이
INSERT 쿼리에 최적화된 테이블 설계이다.

profile
Backend Engineer

0개의 댓글