MySQL 파티션 테이블 가이드
들어가며: 파티션의 필요성
대규모 데이터베이스를 운영하다 보면 마치 거대한 도서관을 관리하는 것과 같은 어려움을 겪게 됩니다. 수백만 건의 데이터를 하나의 테이블에서 관리한다면, 책장 전체를 뒤져야 하는 것처럼 검색 시간이 오래 걸리고 관리도 어려워집니다. 이러한 문제를 해결하기 위해 MySQL은 파티셔닝이라는 강력한 기능을 제공합니다.
파티션 테이블의 이해
파티션 테이블은 마치 도서관의 책을 주제별로 나누어 관리하는 것과 같습니다. 하나의 큰 테이블을 여러 개의 작은 물리적 조각(파티션)으로 나누어 저장하지만, 사용자 입장에서는 여전히 하나의 테이블처럼 사용할 수 있습니다.
예를 들어, 온라인 쇼핑몰의 주문 내역을 연도별로 파티셔닝한다고 생각해봅시다:
-- 주문 내역 테이블을 연도별로 파티셔닝하는 예제
-- 실제 운영에서 자주 사용되는 구조입니다
CREATE TABLE orders (
order_id INT,
order_date DATE,
customer_id INT,
amount DECIMAL(10,2),
-- 파티션 키가 포함된 PRIMARY KEY
PRIMARY KEY (order_id, order_date)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
이렇게 구성하면 2023년 주문을 조회할 때, MySQL은 p2023 파티션만 검색하면 되므로 성능이 크게 향상됩니다.
파티션의 종류와 실전 활용
1. Range Partitioning (범위 파티셔닝)
시간이나 숫자 범위로 데이터를 나눌 때 사용합니다. 주로 날짜별 로그 데이터나 연령대별 회원 정보 관리에 적합합니다.
-- 예제: 고객의 연령대별 파티셔닝
CREATE TABLE customers (
id INT,
birth_year INT,
name VARCHAR(100),
email VARCHAR(100),
PRIMARY KEY (id, birth_year)
)
PARTITION BY RANGE (birth_year) (
PARTITION p_gen_z VALUES LESS THAN (2000),
PARTITION p_millenial VALUES LESS THAN (1995),
PARTITION p_gen_x VALUES LESS THAN (1980),
PARTITION p_others VALUES LESS THAN MAXVALUE
);
2. List Partitioning (목록 파티셔닝)
지역 코드나 카테고리처럼 고정된 값 목록으로 데이터를 나눌 때 사용합니다:
-- 예제: 지역별 매장 정보 파티셔닝
CREATE TABLE stores (
store_id INT,
region_code CHAR(2),
store_name VARCHAR(100),
revenue DECIMAL(10,2),
PRIMARY KEY (store_id, region_code)
)
PARTITION BY LIST (region_code) (
PARTITION p_capital VALUES IN ('SE', 'GG'), -- 수도권
PARTITION p_south VALUES IN ('BS', 'GJ', 'DG'), -- 남부권
PARTITION p_central VALUES IN ('DJ', 'GW') -- 중부권
);
3. Hash Partitioning (해시 파티셔닝)
데이터를 균일하게 분산시키고 싶을 때 사용합니다. 시스템이 자동으로 데이터를 분산시켜줍니다:
-- 예제: 사용자 로그 데이터 해시 파티셔닝
CREATE TABLE user_logs (
log_id INT,
user_id INT,
action_type VARCHAR(50),
log_time TIMESTAMP,
PRIMARY KEY (log_id, user_id)
)
PARTITION BY HASH(user_id)
PARTITIONS 4; -- 4개의 파티션으로 균등하게 분할
파티션 관리와 최적화
파티션 상태 모니터링
-- 파티션별 데이터 분포 확인
SELECT
PARTITION_NAME,
TABLE_ROWS,
DATA_LENGTH/1024/1024 as 'Data Size (MB)'
FROM
INFORMATION_SCHEMA.PARTITIONS
WHERE
TABLE_NAME = 'your_table_name';
파티션 유지보수
-- 새로운 파티션 추가
ALTER TABLE orders ADD PARTITION (
PARTITION p2025 VALUES LESS THAN (2026)
);
-- 오래된 파티션 삭제
ALTER TABLE orders DROP PARTITION p2022;
-- 파티션 재구성
ALTER TABLE orders REORGANIZE PARTITION p_future INTO (
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
실전 운영 팁
- 파티션 키 선정: 쿼리에서 자주 사용되는 WHERE 조건을 파티션 키로 선택합니다.
- 파티션 수 관리: 너무 많은 파티션은 오히려 성능을 저하시킬 수 있습니다. 일반적으로 테이블당 50개 이하를 권장합니다.
- 데이터 분포 모니터링: 특정 파티션에 데이터가 몰리지 않도록 주기적으로 확인합니다.
- 백업 전략: 파티션별로 백업을 수행하면 백업/복구 시간을 단축할 수 있습니다.
주의사항
- PRIMARY KEY에는 반드시 파티션 키가 포함되어야 합니다.
- FOREIGN KEY 제약조건은 파티션 테이블에서 사용할 수 없습니다.
- 파티션 간 JOIN 연산은 성능 저하를 초래할 수 있으므로 신중히 설계해야 합니다.
- 너무 잦은 파티션 키 값 변경은 성능 문제를 일으킬 수 있습니다.
마치며
파티션 테이블은 대용량 데이터 관리를 위한 강력한 도구이지만, 신중한 설계와 지속적인 관리가 필요합니다. 실제 데이터의 특성과 접근 패턴을 충분히 분석한 후, 적절한 파티셔닝 전략을 선택하시기 바랍니다.
'Database > My SQL' 카테고리의 다른 글
[DB] 파티션 테이블(Partition Table)이란? (0) | 2025.01.04 |
---|---|
커버링 인덱스 (Covering Index) 를 사용해서 쿼리 최적화하기 (0) | 2024.11.30 |
MySQL Index 정리 및 팁 (0) | 2022.05.16 |