Database

[DB] 분산 저장 기법 - 1. 파티셔닝(Partitioning)

Code & Beyond 2025. 3. 2. 11:16

파티셔닝(Partitioning) 이란?

파티셔닝이란 데이터베이스, 하나의 테이블 또는 인덱스를 여러 개의 논리적 조각(파티션)으로 나누는 기법으로, 대용량 데이터를 효율적으로 관리, 검색, 성능 최적화하는 데에 사용된다. 

 

파티셔닝의 사용 목적

  • 쿼리 성능 향상
    • 특정 파티션에만 접근해 데이터를 조회하므로 검색 속도가 향상
    • 불필요한 데이터 스캔을 방지하여 I/O 부하 감소
  • 데이터 관리 용이
    • 오래된 데이터를 별도의 파티션으로 분리하여 관리 가능
    • 특정 파티션만 백업하거나 삭제할 수 있어 관리가 편리
  • 병렬 처리 (Parallel Processing)
    • 여러 파티션을 동시에 처리하여 성능을 향상시킬 수 있음

파티셔닝의 종류

1. 해시 파티셔닝 (Hash Partitioning)

 

특정 컬럼을 해시함수를 사용해 분산 저장하는 방식으로 데이터가 설정한 파티션 수 만큼 분배 되므로 부하가 집중되지 않는다는 장점이 있지만 특정 범위 데이터를 조회할 수 때 성능이 저하될 수 있다.

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;

 

 

 

위의 예제에서는 store_id 로 4개의 파티션에 분산 저장된다. 균등한 데이터 분산이 필요한 경우에 사용되면 좋을 파티셔닝 방법이다. 만약 hired (date) 컬럼을 선택한다면 채용이 활발한 시즌에 쿼리가 집중되어 병목 현상이 발생된다. hired 대비해서 데이터가 고르게 분산되는 컬럼을 선택하는 것이 다소 효율적일 것이다.

 

2. 리스트 파티셔닝 (List Partitioning)

 

특정 컬럼의 목록(List) 를 기준으로 데이터를 분할하는 방식으로 국가, 지역, 카테고리, 제품군 같은 데이터 그룹화에 적합하다. 

CREATE TABLE orders (
    order_id INT,
    country VARCHAR(50),
    amount DECIMAL(10,2)
)
PARTITION BY LIST (country) (
    PARTITION p_korea VALUES IN ('Korea'),
    PARTITION p_germany VALUES IN ('Germany'),
    PARTITION p_others VALUES IN ('USA', 'UK', 'Japan')
);

 

그룹화가 자주 바뀌지 않는 데이터셋 일수록 노동 대비 효과가 클 수 있다. 다만 그룹화의 변경 빈도가 잦을 수록 파티셔닝 수정을 해야하기 때문에 그 부분을 감안하고 적용하는 것이 좋다. 그리고 특정 카테고리에 데이터가 몰릴 경우에는 특정 파티션에 부하가 증가될 수 있는 점도 함께 고려해야할 부분이다.

 

3. 범위 기반 파티셔닝 (Range Partitioning)

특정 범위를 기준으로 데이터를 여러 개의 파티션으로 나누는 방식이다. 즉, 데이터의 특정 값이 특정 범위 안에 있으면 해당 파티션에 저장된다. 범위 검색이 많을 때 성능을 향상 시키기 수월하고, 시간, 가격, 나이 순번 등의 연속적인 데이터 처리에 적합하다.

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025)
);

 

WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31' 쿼리를 실행하면 p2023 파티션만 조회하므로 성능 최적화 가능하다. 범위 파티셔닝 또한 일부 범위에 데이터가 몰릴 경우 특정 파티션의 부하가 증가한다. 또한 새로운 범위가 추가되는 경우에 파티션을 추가해야한다.

 

4. 조합 파티셔닝 (Composite Partitioning)

조합(Composite) 파티셔닝(Composite Partitioning) 은 두 개 이상의 파티셔닝 기법을 함께 사용하여 데이터를 분할하는 방식이다. 한 번의 파티셔닝으로 나누고, 다시 다른 기준으로 서브 파티셔닝을 적용하여 더 정밀한 데이터 분배와 최적화를 수행한다.

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    country VARCHAR(50)
)
PARTITION BY RANGE (YEAR(order_date)) 
SUBPARTITION BY LIST (country) (
    PARTITION p2022 VALUES LESS THAN (2023) (
        SUBPARTITION p_korea VALUES IN ('Korea'),
        SUBPARTITION p_germany VALUES IN ('Germany'),
        SUBPARTITION p_other VALUES IN ('USA', 'UK', 'Japan')
    ),
    PARTITION p2023 VALUES LESS THAN (2024) (
        SUBPARTITION p_korea VALUES IN ('Korea'),
        SUBPARTITION p_germany VALUES IN ('Germany'),
        SUBPARTITION p_other VALUES IN ('USA', 'UK', 'Japan')
    )
);

 

위의 예시는 범위 + 리스트 파티셔닝을 조합한 파티셔닝이다. 다양한 데이터 분류 기준을 결합해서 정교하게 퀴리 성능 최적화에 유리하지만 설계가 복잡하고 일부 DBMS에서는 지원하지 않거나 잘못된 설계로 되려 성능을 저하시키기도 한다.

 

 

참조

https://dev.mysql.com/doc/refman/8.4/en/partitioning.html

https://dev.mysql.com/doc/refman/8.4/en/partitioning-hash.html

'Database' 카테고리의 다른 글

[DB] 트랜잭션 (Transaction)의 4가지 속성 - ACID 란  (0) 2025.06.30
[DB] CAP 이론  (0) 2025.03.16
[DB] 분산 저장 기법 - 2. 샤딩 (Sharding)  (0) 2025.03.09