• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 1. MySQL Partitioning 개요
    2. Partitioning Types
    1. RANGE 파티셔닝
    2. LIST 파티셔닝
    3. COLUMNS 파티셔닝
    4. HASH 파티셔닝
    1. LINEAR HASH 파티셔닝
    5. KEY 파티셔닝
    6. 서브 파티셔닝
    7. MySQL Partitioning NULL 처리
    3. 파티션 관리
    4. Partition Pruning
    5. 파티션 선택
    6. 파티셔닝 제약 및 제한
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

19.2.4 HASH 파티셔닝

19.2.4.1 LINEAR HASH 파티셔닝

HASH 자동 파티션은 미리 정해진 수의 파티션에 데이터를 균등하게 배분하는 데 주로 사용됩니다. RANGE 또는 LIST 파티셔닝은 지정된 컬럼 값 또는 컬럼 값 세트가 어떤 파티션에 저장되는지를 명시 적으로 지정해야합니다. HASH 파티셔닝은 MySQL이이를 자동으로 수행하기 위해 필요한 것은 해시되는 컬럼 값 또는 컬럼 값을 기준 식 및 파티션 된 테이블이 여러 파티션으로 분할하는 방법을 지정할 수 뿐입니다.

HASH 파티셔닝을 사용하여 테이블을 분할하는 경우에는 CREATE TABLE 문에 PARTITION BY HASH ( expr ) 조항을 추가해야합니다. 여기서 expr 은 정수를 반환하는 식입니다. 여기에는 형태가 MySQL의 정수 중 하나 인 컬럼의 이름을 간단하게 지정할 수 있습니다. 또한 이것은 뒤에 대부분의 경우 PARTITIONS num 절을 계속합니다. 여기서 num 은 테이블이 여러 파티션으로 분할되는지를 나타내는 양의 정수입니다.

예를 들어, 다음 명령문은 store_id 컬럼에 해시를 사용하여 4 개의 분할 된 테이블을 만듭니다.

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(store_id)
PARTITIONS 4;

PARTITIONS 절을 포함하지 않는 경우, 파티션의 수는 기본적으로 1 입니다.

PARTITIONS 키워드를 사용하는 경우, 그 뒤에 숫자를 지정하지 않으면 구문 오류입니다.

정수를 반환하는 SQL 표현식을 expr 에 사용할 수 있습니다. 예를 들어 직원이 고용 된 연도에 따라 분할한다고합니다. 이것은 다음과 같이 할 수 있습니다.

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;

expr 은 상수가 아닌 임의가 아닌 정수 값 (즉, 변화하는 그러나 결정적이어야)을 반환해야, 섹션 19.6 "파티셔닝 제약 및 제한" 에 설명되어있는 금지 된 구조 를 포함해서는 없습니다. 또한이 식은 행이 삽입 또는 업데이트 (또는 경우에 따라서는 삭제) 될 때마다 평가되어야합니다. 이것은 매우 복잡한 수식이 성능 문제를 일으킬 수 있다는 것을 의미합니다 (특히 한 번에 많은 행에 영향을주는 작업 (일괄 삽입 등)을 실행할 때).

가장 효율적인 해시 함수는 단일 테이블 컬럼에 실행되고 그 값이 열 값에 대해 비례 적으로 증가 또는 감소하는 것으로,이를 통해 파티션의 범위를 "가지 치기"할 수 있습니다. 즉,식이 그 기반 컬럼의 값에 더 밀접하게 변화할수록 MySQL은 식을 HASH 파티셔닝보다 효율적으로 사용할 수 있습니다.

예를 들어, date_col 이 DATE 형태의 컬럼 인 경우, 식 TO_DAYS(date_col) 는 date_col 값에 정비례한다고 표현됩니다. date_col 값이 바뀔 때마다 수식의 값이 일정한 방식으로 변화하기 때문입니다. date_col 대한 식 YEAR(date_col) 의 변화는 TO_DAYS(date_col) 정도 비례하지 않습니다. date_col 의 모든 변화에 YEAR(date_col) 가 동등하게 변화한다고는 할 수 없기 때문입니다. 그래도 YEAR(date_col) 는 해시 함수의 좋은 후보 중 하나입니다. date_col 의 일부와 정비례하고 date_col 의 변화에 의해 YEAR(date_col) 에 비례이지 않은 변화가 발생할 수 없기 때문입니다.

비교를 위해 형식이 INT 인 int_col 라는 컬럼이 있다고합니다. 식 POW(5-int_col,3) + 6 를 검토하여보십시오. 이것은 int_col 값이 변화 할 때, 식의 값에 비례 적으로 변화 보장되지 않기 때문에 해시 함수의 좋은 후보 선택의 여지가 없습니다. int_col 값이 일정량으로 변화 할 때, 식의 값의 변화량이 커질 가능성이 있습니다. 예를 들어, int_col 가 5 에서 6 으로 변경하면 수식의 값이 -1 로 변화하고 있지만 int_col 의 값이 6 에서 7 로 변화하면 식의 값이 -7 변화합니다.

즉, 컬럼 값과 식의 값의 그래프가 방정식 y= c x (여기서 c 는 제로가 아닌 어떤 상수)에 의해 그려지는 같은 직선에 가까워 질수록 그 식은 해시에 의해 적절합니다. 이것은식이 비​​선형 일수록 파티션에 대한 데이터의 분배가 불균형 해지는 경향이있는 것에 관계하고 있습니다.

이론적으로는 여러 컬럼 값을 사용하는 식을 정리 할 수​​ 있지만, 그런 식의 어느 것이 적합한 지 판단하는 것이 매우 어렵고 시간이 걸릴 수 있습니다. 따라서 여러 컬럼을 포함 해시 식을 사용하는 것은 그다지 권장되지 않습니다.

PARTITION BY HASH 가 사용 된 경우 MySQL은 사용자 함수의 결과의 법에 따라 num 파티션 중 어떤 파티션을 사용할지 여부를 결정합니다. 즉, 식 expr 의 경우 레코드가 저장되는 파티션은 파티션 번호 N 입니다 (여기서 N = MOD( expr , num ) ). 테이블 t1 이 다음과 같이 4 개의 파티션을 갖도록 정의되어 있다고합니다.

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY HASH( YEAR(col3) )
    PARTITIONS 4;

t1 에 col3 값이 '2005-09-15' 인 레코드를 삽입 한 경우 그것이 저장되는 파티션은 다음과 같이 결정됩니다.

MOD(YEAR('2005-09-01'),4)
=  MOD(2005,4)
=  1

MySQL 5.6는 파티션 된 테이블에 삽입 된 새 행의 배치를 결정하기 위해 더 복잡한 알고리즘을 사용하는 선형 해시라는 HASH 파티셔닝의 변형도 지원합니다. 이 알고리즘은 섹션 19.2.4.1 "LINEAR HASH 파티셔닝" 를 참조하십시오.

사용자 함수는 레코드가 삽입되거나 업데이트 될 때마다 평가됩니다. 상황에 따라 레코드가 삭제되는 경우에도 평가 될 수 있습니다.

참고

파티션 된 테이블에 UNIQUE 키가있는 경우 HASH 사용자 함수 또는 KEY 의 column_list 인수로 지정하는 컬럼은, 키의 일부인해야합니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved