대규모 데이터베이스의 확장성을 높이기 위해 사용되어지는 기술인 파티셔닝과 샤딩에 대해서 알아보고자 한다.
🔎 파티셔닝?
큰 테이블을 여러 테이블로 나누는 것. 큰 테이블이나 인덱스를 파티션이라는 단위로 물리적으로 분할하는 것을 의미한다.
✅ 파티셔닝의 방식
- 수직 파티셔닝 (Vertical Partitioning)
컬럼을 기준으로 테이블을 분할하는 방식
- 수평 파티셔닝 (Horizontal Partitioning)
레코드를 기준으로 테이블을 분할하는 방식

✅ 파티셔닝의 종류
- 범위 분할 (range partitioning)
지정한 범위에 따라 파티션을 나눈다. 날짜나 우편번호와 같은 연속적인 범위의 데이터를 분리할 수 있다.
- 목록 분할 (list partitioning)
목록에 따라 파티션을 나눈다. 국가나 지역, 카테고리 등 기준에 따라 목록을 나눌 수 있는 대상을 기준으로 한다.
- 해시 분할 (hash partitioning)
해시 함수를 적용해서 파티션을 나눈다. 해시값을 기준으로 하기에 데이터 간의 연관성 없이 고르게 분배할 수 있다.
- 합성 분할 (composite partitioning)
위 3가지 파티션 분할 방식을 결합해서 파티션을 나눈다. 범위 + 목록의 합성 분할을 예로 들면, 연도별(범위) 인기 카테고리(목록) 정보를 기준으로 나누는 것을 의미한다.

✅ 파티셔닝 사용 예시
- 정규화
중복된 데이터를 최소화하기 위해 테이블을 나누는 작업인 정규화도 수평 파티셔닝의 한 종류라고 볼 수 있다.
- 필요에 따른 테이블 분리
예를 들어, 리스트 화면에서 A테이블의 일부 컬럼만을 요청한다고 가정해 본다. 커버링 인덱스와 같이 리스트 정보에 해당하는 컬럼만으로 구성된 인덱스가 존재하지 않는 이상, SELECT문에 필요한 컬럼만을 명시하더라도 스토리지 엔진에 요청할 떄에는 필요 레코드에 해당하는 모든 컬럼의 정보를 가져온 후 필터링 작업을 거치고 사용자에게 반환하게 된다. 리스트에서는 불필요하지만 사이즈가 큰 컬럼이 존재하고, 요청하는 레코드의 수가 대량인 경우라면, I/O에 대한 부담이 생길 수 있기에..파티셔닝으로 리스트에 표시할 컬럼의 파티션 / 그 외의 컬럼의 파티션으로 나눠서 관리하는 방식도 고려해 볼 수 있다.
✅ 파티셔닝 쿼리
파티션 추가
ALTER TABLE {테이블명} PARTITION BY RANGE ({컬럼}) (
PARTITION {파티션명} VALUES LESS THAN ({기준값}),
PARTITION {파티션명} VALUES LESS THAN ({기준값}),
PARTITION movie_p_max VALUES LESS THAN (MAXVALUE)
);
파티션 병합
ALTER TABLE {테이블명} MERGE PARTITION {파티션명1}, {파티션명2} TO {병합하고자 하는 파티션명};
파티션 삭제
ALTER TABLE {테이블명} DROP PARTITION {파티션명};
파티션 해제
ALTER TABLE {테이블명} REMOVE PARTITIONING;
🔎 샤딩?
동일한 스키마를 가진 테이블을 여러 DB서버에 분산하여 저장하는 방식을 의미한다. 쉽게 설명하지면 수평 파티셔닝을 통해 나뉘어진 테이블을 각각 다른 DB 서버에서 관리하는 것이라고 볼 수 있다.