이 글은 MySQL 공식문서를 바탕으로 공부하고 정리한 내용입니다.
Motivation
-
서비스, 사용자 요구사항의 고도화에 따라서 데이터 규모가 대용량으로 증가되면서, 기존에 사용하던 DB의 용량(storage)과 성능(performance)에 한계가 생기게 된다.
-
즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하게 되었고, 이런 이슈를 해결하기 위한 방법으로 테이블을
partition
이라는 몇 개의 단위로 나눠서 관리하는파티셔닝(Partitioning)
기법을 활용하면 된다. -
파티셔닝(Partitioning)
기법을 통해 SW적으로 DB를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다.
파티셔닝이란
-
파티셔닝(Partitioning)
이란 하나의 테이블을 다수의 테이블로 분할하여 관리하는 것을 의미하며, 프로그래머 입장에서는 여전히 하나의 테이블로 동작하는 것처럼 사용할 수 있다. -
즉, 큰 테이블이나 인덱스를, 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 의미한다.
-
논리적으로는 하나의 테이블처럼, 물리적으로는 여러 개의 테이블로 구성된다.
파티셔닝의 목적
성능(performence)
-
특정 DML과 Query의 성능을 향상시킨다.
-
주로 대용량 data wirte 환경에 효율적이다.
-
특히, full scan에서 데이터 access의 범위를 줄여 성능 향상을 가져온다.
가용성(Availability)
-
물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
-
각 분할 영역(partition 별로)을 독립적으로 백업하고 복구할 수 있다.
-
table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 update 성능을 향상시킨다.
관리 용이성(Manageability)
- 큰 테이블을 제거하여 관리를 쉽게 해준다.
파티셔닝의 장단점
장점
- 관리적 측면: partition 단위 백업, 추가, 삭제, 변경
- 전체 데이터를 손실할 가능성이 줄어들어 데이터 가용성이 향상된다.
- partition별로 백업 및 복구가 가능하다.
- partition 단위로 I/O 분산이 가능하며 update 성능을 향상시킨다.
- 성능적 측면: partition 단위로 조회 및 DML 수행
- 데이터 전체 검색시 필요한 부분만 탐색해 성능이 증가된다.
- 즉, full scan에서 데이터 접근의 범위를 줄여 성능 향상을 가져온다.
- 필요한 데이터만 빠르게 조회할 수 있기 때문에 쿼리 자체가 가볍다.
단점
- table간 JOIN에 대한 비용이 증가한다.
- table과 index를 별도로 파티셔닝할 수 없다. -> table과 index를 같이 파티셔닝해야 한다.
파티셔닝 방식
- 테이블을 파티셔닝하는 방법은 크게 2가지로 구분할 수 있다.
- 수평 분할 - 주로 사용
- 수직 분할
수평 분할 방식
- 수평분할(Horizontal Partitioning)은 행(row)을 기준으로 테이블을 분할하는 형테이다.
수직 분할 방식
- 특정 열에 대한 접근을 제한하거나 성능 향상이 필요할 때 열(column) 기준으로 분할하는 방식이다.
파티셔닝 종류
RANGE 파티셔닝
-
지정된 범위에 속하는 열 값을 기반으로 파티션에 행을 할당한다.
-
예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
LIST 파티셔닝
-
값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
-
예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
HASH 파티셔닝
-
해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
-
예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
KEY 파티셔닝
-
key 파티션은 hash 파티션과 거의 동일하다.
-
key 파티션은 선정된 파티션 키 값에 대하여 내부적으로 MD5()을 이용하여 해시값을 계산하고, 그 값에 MOD를 적용하여 저장할 파티션을 결정한다.