Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MySQL / MariaDB 파티션 종류 본문

MySQL/파티셔닝

MySQL / MariaDB 파티션 종류

`O` 2021. 6. 23. 03:13
728x90
반응형

해당 페이지에서는 MySQL / MariaDB 의 파티션종류에 대해서 다룬다.

 

참조페이지

 

https://dev.mysql.com/doc/refman/5.7/en/partitioning.html 

 

 

 

 

MySQL / MariaDB 파티션 지원 범위

 

MySQL /  MariaDB 는 타 DB 영역과 다르게 여러 스토리지 엔진을 지원한다. (가장 많이 쓰이는건 innoDB 다.)

이에 따라 사용하는 스토리지 엔진에 따라 파티션 생성가능 여부를 아래와 같이 확인 할 수 있다.

 

# 단순 명령어로 조회

mysql> SHOW PLUGINS;
+------------+----------+----------------+---------+---------+
| Name       | Status   | Type           | Library | License |
+------------+----------+----------------+---------+---------+
| binlog     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| partition  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ARCHIVE    | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| BLACKHOLE  | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| CSV        | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| FEDERATED  | DISABLED | STORAGE ENGINE | NULL    | GPL     |
| MEMORY     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| InnoDB     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MRG_MYISAM | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| MyISAM     | ACTIVE   | STORAGE ENGINE | NULL    | GPL     |
| ndbcluster | DISABLED | STORAGE ENGINE | NULL    | GPL     |
+------------+----------+----------------+---------+---------+
11 rows in set (0.00 sec)

# information_schema 에서 조회

mysql> SELECT
    ->     PLUGIN_NAME as Name,
    ->     PLUGIN_VERSION as Version,
    ->     PLUGIN_STATUS as Status
    -> FROM INFORMATION_SCHEMA.PLUGINS
    -> WHERE PLUGIN_TYPE='STORAGE ENGINE';
+--------------------+---------+--------+
| Name               | Version | Status |
+--------------------+---------+--------+
| binlog             | 1.0     | ACTIVE |
| CSV                | 1.0     | ACTIVE |
| MEMORY             | 1.0     | ACTIVE |
| MRG_MYISAM         | 1.0     | ACTIVE |
| MyISAM             | 1.0     | ACTIVE |
| PERFORMANCE_SCHEMA | 0.1     | ACTIVE |
| BLACKHOLE          | 1.0     | ACTIVE |
| ARCHIVE            | 3.0     | ACTIVE |
| InnoDB             | 5.7     | ACTIVE |
| partition          | 1.0     | ACTIVE |
+--------------------+---------+--------+
10 rows in set (0.00 sec)

 

여기서 status 가 ACTIVE 가 아니면 우리가 사용하는 DB 에서는 해당 스토리지 엔진은 파티셔닝이 불가하는 뜻이다.

 

 

 

 

MySQL / MariaDB 파티션 종류

 

MySQL 8.0 기준으로 MySQL 은 크게 4가지의 파티션 종류를 지원한다.

 

 

-- RANGE PARTITION

 

제목 그대로 특정 값에 대해서 일정 간격의 범위로 나눌때 쓰인다. 숫자나 날짜 데이터 Type 에 쓰기 좋다.

 

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
    PARTITION p0 VALUES LESS THAN (6),
    PARTITION p1 VALUES LESS THAN (11),
    PARTITION p2 VALUES LESS THAN (16),
    PARTITION p3 VALUES LESS THAN (21)
);

 

-- LIST PARTITION

 

RANGE 같이 특정 범위로 나누는건 유사하나 LIST 라는 이름과 같이 범위가 아닌 특정 유형 값이 포함된 데이터들을 묶는 것이다.

 

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

 

-- HASH PARTITION

 

특정 데이터 값을 기준으로 삼고, 이 값들을 HASH 함수에 따라 균등하게 나누어 지도록 하는 형태다. HASH 함수로 나누는 기준 컬럼을 사용자가 정의 해야하며 range, list 파티션 같이 일정 범위나 유형으로 파티션을 나누었는데 이에 대한 데이터 분포도가 고르지 않을 때 사용할수 있는 유용한 생성 유형이다.

 

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;

 

-- KEY PARTITION

 

HASH 파티셔닝과 유사하나 이 방법은 사용자가 분류 기준 컬럼을 정의하지 않고 데이터베이스 자체가 알아서 분류를 해서 나누는 차이점이 있다.

 

CREATE TABLE k1 (
    id INT NOT NULL,
    name VARCHAR(20),
    UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;
반응형
Comments