Backend

[DB][알쓸코지] 파티셔닝(Partitioning)

chocoji 2024. 3. 7. 15:20

파티셔닝(Partitioning)

대용량 테이블이나 인덱스를 작은 논리적 단위로 나누는 행위를 의미하며,
파티셔닝된 테이블의 하위 부분(테이블 혹은 인덱스) `파티션(Partition)`이라고 한다.

https://blog.skby.net/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%85%8C%EC%9D%B4%EB%B8%94-%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9D-table-partitioning/

  • 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개로 분할하여 관리할 수 있게 된다.
  • 내부적으로 분리되어 처리되기 때문에 사용자에게는 하나의 테이블로 보인다.
  • 데이터베이스 분산 전략 중 하나
💡 데이터베이스 분산 전략
: 데이터를 여러 위치에 나누어 저장하고 처리하는 방식을 결정하는 전략
➡️ 데이터의 효율적인 관리, 확장성 확보, 성능 최적화 등을 목표로 한다.

1. 복제(Replication): 동일한 데이터를 여러 노드에 복제해서 각 서버가 읽기 요청을 독립적으로 처리할 수 있도록 분산하여 성능을 향상시킨다. 
2. 페더레이션(Federation): 데이터베이스를 기능에 따라 나눈 여러 개의 작은 데이터베이스로 구성된 데이터베이스 생성
3. 파티셔닝, 샤딩: 데이터베이스를 작은 부분으로 나누어 분산 저장하는 방식

 

DB 파티셔닝 종류 - 수평(Horizontal) vs 수직(Vertical)

수평 분할

하나의 테이블의 각 행을 다른 테이블로 분산시키는 것

  • 파티션 키를 기준으로 데이터를 나눈다.
  • 데이터의 크기가 커서 성능을 향상시키거나, 특정 범위의 데이터에 대한 작업을 최적화하는 데 유용하다.
    • ex) 입사년도 기준으로 직원 테이블을 분할했을 때, 특정 년도에 입사한 직원들의 정보에 빠르게 접근할 수 있다.
  • 장점
    • 성능 향상: 특정 파티션에 대한 작업을 병렬로 수행할 수 있어 성능이 향상된다.
    • 유연성: 필요한 파티션만 로드하여 불필요한 데이터를 처리하지 않아도 된다.
  • 단점
    • 조인 연산: 여러 파티션 간의 조인 연산이 필요한 경우 성능 저하가 발생할 수 있다.
    • 데이터 편향: 데이터 분포가 고르지 않거나 일부 파티션이 다른 파티션보다 더 많은 쿼리를 수행할 경우 데이터 편향이 발생하여 성능 및 로드 밸런싱에 영향을 줄 수 있다.

vs 샤딩(Sharding)

같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 기법

  • 대규모 데이터를 더 작은 단위로 나누는 것은 동일하다.
  • `수평 파티셔닝`은 같은 데이터베이스 내에서 하나의 큰 테이블을 쪼개 분산하여 저장하지만, 
    `샤딩`은 하나의 큰 테이블을 쪼개 각각 다른 데이터베이스에 분산 저장한다는 점이 다르다.
  • 데이터베이스 서버 간의 연결 과정이 많아져 비용이 증가할 수 있다.

수직 분할

데이터의 일부 열을 빼내는 형태로 분할한다. 즉, 테이블의 칼럼을 기준으로 나누어 파티셔닝한다.

  • 각 테이블은 서로 다른 열을 포함하며, 주로 자주 사용되지 않는 열을 분리하여 성능을 최적화하는 데 사용된다.
  • 장점
    • I/O 최적화: 자주 사용되지 않는 열을 분리하여 필요한 데이터만 로드하므로 I/O 비용이 감소한다.
    • 데이터 은닉: 민감한 정보를 포함하는 열을 분리하여 데이터 은닉 및 보안을 강화할 수 있다.
  • 단점
    • 파티션 간 조인: 자주 조인되는 열들이 분리되면 조인 연산이 복잡해지고 성능 저하가 발생할 수 있다.
    • 칼럼 추가 어려움: 새로운 칼럼을 추가하려면 파티션을 재구성해야 할 수도 있으므로 칼럼 추가 작업이 많을 경우 오히려 성능이 저하될 수 있다.
📌 MySQL 8.0 버전을 기준으로, MySQL에서는 수직 분할을 지원하지는 않는다.
💡
하나의 테이블에 데이터가 너무 많이 있고 레코드의 특정 범위만으로 주로 액세스할 경우 수평 분할을,
특별히 자주 조회되는 칼럼이 있거나 특정 칼럼에 보안을 적용해야 하는 경우 수직 분할을 고려해보면 좋을 것 같다.

 

파티션에 인덱스를 거는 두 가지 방식

로컬 인덱스(Local Index)

파티션 테이블의 각 파티션에 대해 별도로 생성되는 인덱스

  • 파티션 테이블에서 사용하는 가장 일반적인 INDEX 생성 방법
  • 각 파티션은 자체 인덱스를 가지며, 해당 파티션에 속한 데이터만을 인덱싱한다.
  • 파티션 간에 독립적으로 관리되기 때문에 파티션 간의 유연한 쿼리 처리가 가능하다.

글로벌 인덱스(Global Index)

전체 테이블의 데이터를 기반으로 생성되는 인덱스

  • 주로 테이블에 있는 모든 데이터에 대한 정렬 및 검색이 필요할 때 사용된다.
  • 파티션 테이블로 이루어져 있는 테이블에 하나의 인덱스가 여러 개의 테이블 파티션과 매핑된다.
  • 파티션 간의 관계를 고려하여 설계되어야 한다.
📌 MySQL에서는 글로벌 인덱스를 지원하지 않는다.

로컬 인덱스를 주로 사용하는 이유는?

로컬 인덱스가 관리하기 쉽기 때문이다.

로그 테이블을 파티션 테이블로 만들고, 시간이 지난 후 필요 없어진 데이터를 `DROP PARTITION` 명령으로 제거한다고 해보자.

  • 글로벌 인덱스로 구성되어 있다면 `DROP` 명령 후 인덱스가 깨져버린다.
    • 이렇게 인덱스가 깨져버리면 `Invalid` 상태가 되고, 이 인덱스를 다시 사용하기 위해서는 인덱스 리빌딩 작업을 다시 해줘야 하는 등 번거로운 작업을 수행해야 한다.
  • 로컬 인덱스로 구성되어 있다면, 파티션별로 하나씩 걸려 있기 때문에 `DROP` 명령 후 함께 제거되고 남은 파티션에는 지장을 주지 않는다.
💡 글로벌 인덱스가 꼭 필요한 상황이 아니라면 로컬 인덱스를 사용하자!

 

Ref

파티셔닝

https://soye0n.tistory.com/267

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%8C%8C%ED%8B%B0%EC%85%98

https://velog.io/@kyeun95/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8C%8C%ED%8B%B0%EC%85%94%EB%8B%9DPartitioning%EC%9D%B4%EB%9E%80

https://www.geeksforgeeks.org/data-partitioning-techniques/

https://code-lab1.tistory.com/202

https://yunamom.tistory.com/291

https://akku-dev.tistory.com/68

 

로컬 인덱스 vs 글로벌 인덱스

https://coding-factory.tistory.com/841

https://gurubee.net/wiki/pages/26743087