본문 바로가기
Back-End

MySQL) Partitioning ( Range , List )

by 어렵다어려웡 2021. 9. 19.

우선 , 파티션이란 DBMS 하나의 서버에서 테이블을 분산하는 것이다.

여기서 테이블의 분산은 특정한 원격서버간의 분산이 아니다.

 

좀더 쉽게 말하자면 특정 테이블에 대한 데이터들을 분산해서 조회하고

이를 통해서 기존의 테이블 전체를 검색하는게 아니라 특정 범위의 데이터를 조회할 수 있게 함으로써 성능적인 면에서 우위를 얻을 수 있게 해주는 것이 주된 기능이라 보면 된다.

 

해당 기능은 MySQL 5.1 버전부터 제공되게 되었다.

파티션의 기능은 4가지 방법으로 Range, List, Hash, Key 의 방법이 존재한다.

 

파티션 또한 마찬가지로 인덱스처럼 무조건 적으로 적용한다고 해서 좋은 방법은 아니다..

 

파티션은 데이터와 인덱스를 조각화 하여 물리적 메모리를 효율적으로 사용하게 해준다.

 

--- 주의사항 --- 

* 파티션을 설정할 때는 2가지 쿼리방식으로 진행한다.  => Create, Alter

주의사항이 있다면 파티셔닝을 칼럼은 무조건 PK로 잡거나, Unique Key로 설정이 되어 있어야 가능하다.

PK가 설정이 되어있지 않으면 Unique를 쫒아서 설정을 하게된다.

 

* 파티션은 이름을 주지 않으면 기본적으로 'p0' 부터 만들어진다.

 

1. Range Partition

Range 파티션은 특정 키의 연속된 범위를 정의한다.

사용되는 예시는 다음과 같다.

 - 날짜 기반으로 데이터가 쌓이며 년, 월 분석 및 삭제를 진행.

 - 대량의 과거 데이터 삭제

 - 잦은 Select

 

Range의 경우 YEAR(), TO_DAYS() 함수만 사용하길 권장하는데 파티션 프루닝이 제대로 동작하지

않기 떄문이라고 한다. 또한 UNIX_TIMESTAMP()를 이용한 변환식, 날짜를 문자열로 포매팅한 형태('2012-02-12')등

형태는 사용하지 않는 것이 권장된다.

 

1-1 Create Query

CREATE TABLE partition_ex (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  ftime datetime DEFAULT NULL,
  KEY id (id)
) ENGINE=InnoDB AUTO_INCREMENT=286802795 DEFAULT CHARSET=utf8
  PARTITION BY RANGE( TO_DAYS(ftime) ) (
    PARTITION p20110401 VALUES LESS THAN (TO_DAYS('2011-04-02')),
    PARTITION p20110402 VALUES LESS THAN (TO_DAYS('2011-04-03')),
    PARTITION p20110403 VALUES LESS THAN (TO_DAYS('2011-04-04')),
    PARTITION future VALUES LESS THAN MAXVALUE
  );

생성하는 쿼리의 가장 마지막 부분에 Partition 명령어부터 이어서 작성을 하면 된다.

 

1-2 Alter Query

alter table member2 PARTITION BY RANGE (YEAR(created_at)) (
    PARTITION p0 VALUES LESS THAN (2010) ,
    PARTITION p1 VALUES LESS THAN (2011) ,
    PARTITION p2 VALUES LESS THAN (2012) ,
    PARTITION p3 VALUES LESS THAN MAXVALUE
    );

직접 작성해서 사용했을 때 나타나는 결과는 다음과 같았다.

p0에는 created_at의 데이터를 보고 2010년 이전의 데이터들을 조회하게 파티셔닝이 설정되어 있다.

 

 

List Partition

List Partition은 Range Partition과 비슷하지만, 아래와 같은 상황에서 일반적으로 사용된다.

  • 파티션 키 값이 코드 값이나 카테고리와 같이 고정 값일 경우
  • 키 값이 연속적이지 않고 정렬순서와 관계없이 파티션을 해야 할 경우
  • 파티션 키 값을 기준으로 레코드 건수가 균일하고 검색 조건에 파티션 키가 자주 사용 될 때

List Partition은 Range Partition과 달리 Null 을 명시할 수 있으며, MaxValue 를 지정할 수는 없다.

MySQL V5.5 부터는 파티션 키 값에 정수형 값 이외에 문자열 타입도 사용 가능하다.

 

* 예시

 

 

다음에는 Key와 Hash를 해보려고한다.

일별로 나누고싶은데 Key로 해야한다고 판단하고 하고있으나 계속 안된다..

 

'Back-End' 카테고리의 다른 글

디자인 패턴의 정의 및 종류  (0) 2021.05.29
정리) Chapter 2  (0) 2021.04.01
Git ) rebase -i  (0) 2021.03.20