mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/05/17 ~ 2023/05/23 #53

Open mojh7 opened 1 year ago

mojh7 commented 1 year ago

다음 스터디

2023-05-23 pm 09:00 화요일

정리 범위

  1. 13.2
  2. 13.3~13.3.1.3.4 (13.3.2 전까지)
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 단비
  2. 장현
mojh7 commented 1 year ago

13.3 MySQL 파티션의 종류

기본 4가지 파티션

해시와 키 파티션에 대해서는 리니어(Linear) 파티션과 같은 추가적인 기법도 제공한다


13.3.1 레인지 파티션

파티션 키의 연속된 범위로 파티션을 정의하는 방법

가장 일반적으로 사용되는 파티션 방법 중 하나

다른 파티션과 달리 MAXVALUE라는 키워드를 이용해 명시되지 않은 범위의 키 값이 담긴 레코드를 저장하는 파티션을 정의할 수 있다


13.3.1.1 레인지 파티션의 용도

다음과 같은 성격을 지닌 테이블에서 레인지 파티션을 사용하는 것이 좋음

마지막 항목은 모든 파티션에 일반적으로 적용되는 내용이지만 레인지나 리스트 파티션에서 더 필요한 요건

DB에서 파티션 장점

첫 번째 보다 두 번째 장점의 효과가 매우 큰편

하지만 파티션을 적용하면서 두 번째 장점보다는 첫 번째 장점에만 집중하다보니 소탐대실되는 경우가 많다

파티션 때문에 오히려 MySQL 서버의 성능을 더 떨어트리게 되는 경우도 생김

저자 경험상 이력을 저장하는 테이블에서 레인지 파티션은 두 가지 장점을 모두 어렵지 않게 취할 수 있어서 최소환 레인지 파티션에 대해서는 정확한 사용 방법을 익혀두길 추천


13.3.1.2 레인지 파티션 테이블 생성

CREATE TABLE employees (
    id INT NOT NULL,
    first_name VARCHAR(30),
    last_name VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    ...
)   PARTITION BY RANGE (YEAR(hired)) (
    PARTITION p0 VALUES LESS THAN (1991) ENGINE=INNODB,
    PARTITION p1 VALUES LESS THAN (1996) ENGINE=INNODB,
    PARTITION p2 VALUES LESS THAN (2001) ENGINE=INNODB,
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

PARTITION BY RANGE

VALUES LESS THAN

VALUES LESS THAN MAXVALUE

테이블과 각 파티션은 같은 스토리지 엔진으로 정의될 수 있다

MySQL 8.0 에서는 InnoDB 스토리지 엔진이 기본 스토리지 엔진이므로 별도로 명시하지 않아도 InnoDB 테이블로 생성된다


13.3.1.3 레인지 파티션의 분리와 병합

13.3.1.3.1 단순 파티션 추가

employess 테이블에 입사 일자가 2001년부터 2010년 이하인 레코드를 저장하기 위한 새로운 파티션 p4를 추가하는 ALTER TABLE 명령

ALTER TABLE employees
ADD PARTITION (PARTITION p4 VALUES LESS THAN (2011));

그런데 이미 해당 테이블은 LESS THAN MAXVALUE 파티션을 가지고 있어서 ALTER TABLE ... ADD PARTITION 명령으로 새로운 파티션을 추가하려고하면 에러가 발생한다

2011년 파티션이 2개의 파티션에 나뉘어 저장되는 결과가 만들어지는데 하나의 레코드는 반드시 하나의 파티션에만 저장돼야 한다는 기본 조건을 벗어났다\

다음과 같이 해야함

ALTER TABLE employees ALGORITHM=INPLACE, LOCK=SHARED,
REORGANIZE PARTITION p3 INFO (
    PARTITION p3 VALUES LESS THAN (2011),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

ALTER TABLE ... REORGANIZE PARTITION 명령은 p3 파티션의 레코드를 모두 새로운 두 개의 파티션으로 복사하는 작업을 필요로 한다

그래서 레인지 파티션에서는 일반적으로 LESS THAN MAXVALUE 절을 사용하는 파티션은 추가하지 않고, 미래에 사용될 파티션을 2~3 개 정도 더 만들어 놓는 방식으로 테이블을 생성한다고 함

그리고 배치 스크립트를 이용해 주기적으로 파티션 테이블의 여유 기간을 판단해서 파티션을 자동으로 추가하는 방법을 사용한다

LESS THAN MAXVALUES 파티션이 존재한다고 하더라도 이 파티션이 데이터를 가지고 있지 않다면 ALTER TABLE ... REORGANIZE PARTITION 명령은 매우 빨리 완료될 것이므로 성능 걱정을 안해도 된다


13.3.1.3.2 파티션 삭제

레인지, 리스트 파티션 테이블에서 특정 파티션을 삭제하는 작업은 아주 빠름

ALTER TABLE employees DROP PARTITION p0;

레인지 파티션을 사용하는 테이블에서는 항상 가장 오래된 파티션 순서로만 삭제할 수 있다


13.3.1.3.3 기존 파티션의 분리

ALTER TABLE employees ALGORITHM=INPLACE, LOCK=SHARED,
REORGANIZE PARTITION p3 INFO (
    PARTITION p3 VALUES LESS THAN (2011),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);

MAXVALUE 말고도 다른 파티션도 분리할 수 있다

기존 파티션의 레코드를 새로운 파티션으로 복사해야 하기 때문에 기존 파티션의 레코드 수가 많다면 온라인 DDL로 실행할 수 있게 ALGORITHM과 LOCK절을 사용하자

파티션 재구성 명령은 INPLACE 알고리즘은 사용할 수 있지만 최소한 읽기 잠금이 필요


13.3.1.3.4 기존 파티션의 병합

병합도 REORGANIZE PARTITION 명령으로 처리할 수 있다

ALTER TABLE employees ALGORITHM=INPLACE, LOCK=SHARED,
REORGANIZE PARTITION p2, p3 INFO (
    PARTITION p23 VALUES LESS THAN (2011),
);

p2 파티션과 p3 파티션을 p23 파티션으로 병합


danbi5228 commented 1 year ago

13.2 주의사항

13.2.2 파티션 사용 시 주의사항

13.2.2.1 파티션과 유니크 키(프라이머리 키 포함)

13.2.2.2 파티션과 open_files_limit 시스템 변수 설정