1. what is Partitioning(파티셔닝)?
대용량 데이터를 다루는 데이터베이스에서 성능 최적화와 관리 효율성을 위해 사용하는 대표적인 기법이 있습니다. 바로 파티셔닝(Partitioning)입니다. 하지만 파티셔닝이 항상 좋은 것은 아닙니다. 오늘은 파티셔닝의 개념부터 장점, 단점, 그리고 적용 시 고려해야 할 점까지 자세히 알아보겠습니다.
2. 파티셔닝의 장점
✅ 성능 향상
- 특정 파티션만 조회하면 되므로 검색 속도가 빨라집니다.
- 불필요한 데이터를 조회할 필요가 없어 쿼리 실행 시간이 줄어듭니다.
✅ 데이터 관리 용이
- 오래된 데이터를 손쉽게 삭제할 수 있습니다.
- 특정 파티션만 백업 및 복구할 수 있어 유지보수가 편리합니다.
✅ 부하 분산
- 여러 디스크에 데이터를 분산 저장하여 서버 부하를 줄일 수 있습니다.
- 특정 테이블이 과부하를 일으키는 경우, 파티셔닝을 통해 부하를 균등하게 분배할 수 있습니다.
✅ 운영 비용 절감
- 자주 사용하지 않는 데이터를 별도의 저장소로 이동하여 비용을 절감할 수 있습니다.
3. 파티셔닝의 종류
유형 | 설명 | 예시 |
범위 파티셔닝 (Range Partitioning) | 특정 범위를 기준으로 데이터를 나눔 | 2023년 데이터, 2024년 데이터 등 |
리스트 파티셔닝 (List Partitioning) | 특정 값의 목록을 기준으로 데이터를 나눔 | 지역(서울, 부산, 대전 등)별 분할 |
해시 파티셔닝 (Hash Partitioning) | 해시 함수를 사용해 데이터를 균등하게 분배 | USER_ID % 4 값을 기준으로 4개의 파티션에 저장 |
조합(컴포지트) 파티셔닝 (Composite Partitioning) | 위 방식들을 조합하여 데이터를 나눔 | 연도별로 분할 후, 다시 해시로 나눔 |
4. 파티셔닝 적용 예시 (MySQL)
예를 들어, order_date 컬럼을 기준으로 범위 파티셔닝을 적용하면 다음과 같습니다.
CREATE TABLE orders (
id INT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (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)
);
이렇게 하면 2022년 데이터는 p2022, 2023년 데이터는 p2023 파티션에 자동으로 저장됩니다.
5. 파티셔닝의 단점 및 주의할 점
무조건적인 파티셔닝은 오히려 독이 될 수 있습니다!
❌ 성능 저하 가능성
- 잘못된 파티셔닝으로 인해 모든 파티션을 검색(Full Scan) 해야 할 수도 있습니다.
- 인덱스 활용이 제한되면 쿼리 성능이 더 나빠질 수도 있습니다.
❌ 관리 복잡성 증가
- 테이블이 여러 개로 나뉘어 운영 및 유지보수가 어려워질 수 있음
- 파티션 추가/삭제 시 데이터 이동이 필요할 수도 있음
❌ 인덱스 사용 제한
- 파티션 키가 인덱스의 첫 번째 컬럼이 아닐 경우, 인덱스를 제대로 활용할 수 없음
❌ 데이터 불균형 문제
- 특정 파티션에 데이터가 집중될 경우, 일부 파티션만 과부하 발생
- 예를 들어, 범위 파티셔닝을 사용했을 때 최신 데이터가 특정 파티션에 집중될 가능성이 큼
6. 언제 파티셔닝을 적용해야 할까?
📌 파티셔닝이 필요한 경우
1. 대용량 데이터(수억~수십억 건)를 다룰 때
2. 특정 기간이 지난 데이터를 쉽게 삭제해야 할 때 (예: 로그 데이터)
3. 자주 조회되는 데이터만 빠르게 검색해야 할 때
4. 서버 부하를 분산해야 할 때
5. 특정 파티션만 백업/복구하여 운영 효율성을 높이고 싶을 때
📌 파티셔닝이 필요 없는 경우
1. 테이블 크기가 작을 때 (수십만 건 이하)
2. 모든 데이터에 자주 접근해야 할 때 (특정 파티션만 검색할 일이 없을 경우)
3. 데이터 분포가 고르게 분산되지 않을 때
4. 인덱스만으로 충분히 최적화가 가능한 경우
'DB' 카테고리의 다른 글
[DB] CONCAT 함수: 문자열 합치기(연결) (0) | 2024.09.03 |
---|---|
[DB] 테이블 컬럼 데이터 타입(Type), 타입 길이(length) 조회 (디비버 사용) (0) | 2024.03.13 |
[DB] 테이블 컬럼 COMMENT 추출하기(디비버 사용) (0) | 2024.03.13 |
[DB] 트랜잭션 - ACID(원자성, 일관성, 고립성, 지속성) (0) | 2023.12.10 |
[Oracle] Oracle java.sql.SQLException: 부적합한 열 유형:1111 (MyBatis) (0) | 2023.08.16 |