본문 바로가기
Backend 🧦/Database ⛱️

[MySQL] 파티셔닝(Partitioning)

by 서니서닝 2024. 5. 27.
728x90

파티셔닝

테이블을 논리적으로 여러 개의 작은 조각으로 나누는 방법

각 조각을 '파티션'이라고 부르며, 이러한 파티션들은 독립적으로 관리될 수 있다.

파티셔닝을 통해 데이터를 분산시켜 특정 쿼리의 성능을 최적화할 수 있다.

 

물리적으로는 여러 테이블로 분산하여 저장되지만, 사용자는 하나의 테이블에 접근하는 것과 같이 사용할 수 있다.

 

 

Range 파티셔닝

특정 범위에 따라 데이터를 분할

ex) 날짜, 숫자의 범위

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    customer_id INT
)
PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p0 VALUES LESS THAN (2020),
    PARTITION p1 VALUES LESS THAN (2021),
    PARTITION p2 VALUES LESS THAN (2022),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

 

List 파티셔닝

지정된 값 목록에 따라 데이터를 분할

주로 카테고리나 상태 값과 같은 데이터를 분할하는 데 사용된다.

CREATE TABLE orders (
    order_id INT,
    status VARCHAR(20),
    customer_id INT
)
PARTITION BY LIST (status) (
    PARTITION p0 VALUES IN ('new', 'processing'),
    PARTITION p1 VALUES IN ('shipped', 'completed'),
    PARTITION p2 VALUES IN ('cancelled')
);

 

Hash 파티셔닝

해시 함수를 사용하여 데이터를 분할

데이터가 고르게 분산되도록 보장하는 데 유용

MySQL 공식 문서에 따르면, 여러 컬럼으로 해싱하는 것은 크게 권장하지 않는다고 한다 (참고).

CREATE TABLE orders (
    order_id INT,
    customer_id INT,
    order_date DATE
)
PARTITION BY HASH(order_id) PARTITIONS 4;

 

Composite 파티셔닝

위 파티셔닝 종류 중 두개 이상을 사용하는 방식

아래는 Rangs-Hash 파티셔닝의 예시이다.

order 테이블을 연도별로 Range 파티셔닝 후, 각 연도 파티션 내에서 hash 파티셔닝을 수행한다.

CREATE TABLE orders (
    order_id INT,
    order_date DATE,
    customer_id INT
)
PARTITION BY RANGE (YEAR(order_date))
SUBPARTITION BY HASH(order_id)
SUBPARTITIONS 4 (
    PARTITION p0 VALUES LESS THAN (2020),
    PARTITION p1 VALUES LESS THAN (2021),
    PARTITION p2 VALUES LESS THAN (2022),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);
728x90

'Backend 🧦 > Database ⛱️' 카테고리의 다른 글

DB 성능테스트 Tool 비교  (0) 2024.05.24

댓글