19.2.4 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
xc
는 제로가 아닌 어떤 상수)에 의해 그려지는 같은 직선에 가까워 질수록 그 식은 해시에 의해 적절합니다. 이것은식이 비선형 일수록 파티션에 대한 데이터의 분배가 불균형 해지는 경향이있는 것에 관계하고 있습니다.
이론적으로는 여러 컬럼 값을 사용하는 식을 정리 할 수 있지만, 그런 식의 어느 것이 적합한 지 판단하는 것이 매우 어렵고 시간이 걸릴 수 있습니다. 따라서 여러 컬럼을 포함 해시 식을 사용하는 것은 그다지 권장되지 않습니다.
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
인수로 지정하는 컬럼은, 키의 일부인해야합니다.