19.1 MySQL의 파티셔닝 개요
이 섹션에서는 MySQL 5.6의 파티셔닝의 개념에 대해 설명합니다.
분할 제한 및 기능 제한 내용은 섹션 19.6 "파티셔닝 제약 및 제한" 을 참조하십시오.
SQL 표준에서는 데이터 저장의 물리적 사양에 대한 지침은별로 볼 수 없습니다. SQL 언어 자체가 그것이 작동하는 스키마, 테이블, 행 또는 열의 기본 데이터 구조와 미디어와 독립적으로 작동하도록 예정되어 있습니다. 그럼에도 불구하고 대부분의 고급 데이터베이스 관리 시스템, 파일 시스템, 하드웨어, 또는 둘 모두에 대한 특정 데이터를 저장하는 데 사용되는 물리적 위치를 판별하는 방법이 개발되어 왔습니다 . MySQL에서 InnoDB
스토리지 엔진은 테이블 공간의 인식이 지원되어 왔으며, MySQL 서버는 파티션이 도입되기 전부터 다른 데이터베이스의 저장에 다른 물리적 인 디렉토리를 사용하도록 구성되었습니다 (이렇게하는 방법에 대한 자세한 내용은 섹션 8.11.3.1 "심볼릭 링크 사용" 을 참조하십시오).
파티션이 인식 한 걸음 더 나아가, 필요에 따라 많은 부분을 설정할 수있는 규칙에 따라 개별 테이블 부분을 파일 시스템에 할당 할 수 있습니다. 그러면 테이블의 다른 부분이 별도의 테이블로 별도의 위치에 저장됩니다. 데이터를 분할하기 위해 사용자가 선택하는 규칙은 파티션 함수라고하며, MySQL은 법 범위 세트 또는 값 목록에 대한 간단한 조합 내부 해시 함수 또는 선형 해시 함수가 사용됩니다. 함수는 사용자가 지정한 파티션 유형에 따라 선택되고 사용자가 지정한 식의 값을 매개 변수로 취합니다. 이 식에 사용되는 파티션의 유형에 따라 컬럼 값 하나 이상의 컬럼 값을 조작하는 함수 또는 하나 이상의 컬럼 값의 집합을 지정할 수 있습니다.
RANGE
, LIST
및 LINEAR
] HASH
분할의 경우 분할 컬럼의 값은 파티셔닝 함수에 전달 된 특정 레코드를 저장해야 파티션의 번호를 나타내는 정수 값이 반환됩니다. 이 함수는 비 상수 및 비 무작위이어야합니다. 쿼리를 포함 할 수 없지만,식이 NULL
또는 다음과 같은 정수 intval
을 반환 한, MySQL에서 유효한 SQL 표현식을 사용할 수 있습니다.
-MAXVALUE <= intval
<= MAXVALUE
( MAXVALUE
는 대상이되는 정수형의 상한을 나타내는 데 사용됩니다. -MAXVALUE
하한을 나타냅니다.)
[ LINEAR
] KEY
, RANGE COLUMNS
와 LIST COLUMNS
파티션의 경우 파티션 표현식은 하나 이상의 컬럼리스트로 구성됩니다.
[ LINEAR
] KEY
분할의 경우 분할 함수는 MySQL에 의해 제공됩니다.
허용되는 파티셔닝 컬럼 유형 및 파티션 함수는 섹션 19.2 "파티션 유형" 및 파티셔닝 구문의 설명 및 추가 예를 보여주고있다 섹션 13.1.17 "CREATE TABLE 구문" 을 참조하십시오. 파티셔닝 기능의 제한 사항은 섹션 19.6.3 "함수에 대한 파티셔닝 제한" 을 참조하십시오.
이것은 "수평 분할"이라고합니다. 즉, 테이블의 다른 행을 다른 물리적 파티션에 할당 할 수 있습니다. MySQL 5.6은 테이블의 다른 컬럼는 서로 다른 파티션에 할당 된 "수직 분할"은 지원하지 않습니다. 현재 수직 분할을 MySQL 5.6에 도입 할 계획은 없습니다.
MySQL 서버 바이너리가 사용자 정의 파티셔닝을 지원하는지 여부의 판단 내용은 19 장 "분할" 을 참조하십시오.
분할 된 테이블을 만들 때 MySQL 서버에 의해 지원되는 대부분의 스토리지 엔진을 사용할 수 있습니다. MySQL 파티셔닝 엔진은 다른 레이어에서 실행되고 있으며, 그 어느 것과도 교환 할 수 있습니다. MySQL 5.6에서는 동일한 파티션 된 테이블의 모든 파티션은 동일한 스토리지 엔진을 사용해야합니다. 예를 들어 파티션에 MyISAM
다른 것에 InnoDB
를 사용 할 수 없습니다. 그러나 동일한 MySQL 서버 또는 동일한 데이터베이스에있는 다른 파티션 된 테이블에 다른 스토리지 엔진을 사용할 수 있습니다.
MySQL 파티셔닝은 MERGE
, CSV
또는 FEDERATED
스토리지 엔진으로 사용할 수 없습니다.
KEY
또는 LINEAR KEY
자동 파티션은 NDB
에서 사용할 수 있지만 다른 유형의 사용자 정의 파티션이 스토리지 엔진을 사용하는 테이블에서 지원되지 않습니다. 또한 사용자 정의 파티셔닝을 사용하는 NDB
테이블에는 명시적인 기본 키가 필요하며, 테이블 파티셔닝 식으로 참조되는 컬럼은 기본 키의 일부 여야합니다. 그러나 사용자 분할 된 NDB
테이블을 만들거나 변경하는 데 사용되는 CREATE TABLE
또는 ALTER TABLE
문 PARTITION BY KEY
절 또는 PARTITION BY LINEAR KEY
절에 열이 하나도 나열되어 있지 않으면 테이블에 명시적인 기본 키는 필요하지 않습니다. 자세한 내용은 섹션 18.1.6.1 "MySQL Cluster의 SQL 구문의 부적합" 을 참조하십시오.
파티션 된 테이블에 특정 스토리지 엔진을 사용하기 위해 필요한 것은 분할되지 않은 테이블의 경우와 마찬가지로 [STORAGE] ENGINE
옵션을 사용하는 것뿐입니다. 그러나 [STORAGE] ENGINE
(및 다른 테이블 옵션)은 CREATE TABLE
문에서 파티셔닝 옵션을 사용하기 전에 지정해야합니다. 다음의 예는 해시에 의해 6 개의 파티션으로 분할되어 InnoDB
스토리지 엔진을 사용하는 테이블을 만드는 방법을 보여줍니다.
CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) ENGINE=INNODB PARTITION BY HASH( MONTH(tr_date) ) PARTITIONS 6;
각 PARTITION
절 [STORAGE] ENGINE
옵션을 포함 할 수 있지만 MySQL 5.6에서는이 효과가 없습니다.
파티셔닝은 테이블의 모든 데이터 및 인덱스에 적용됩니다. 데이터만큼 분할하여 인덱스하지 못하고 (그 반대의 경우도 불가) 테이블의 일부만을 분할 할 수 없습니다.
각 파티션의 데이터 및 인덱스를 특정 디렉토리에 할당하려면 분할 된 테이블을 만드는 데 사용하는 CREATE TABLE
문 PARTITION
절에 DATA DIRECTORY
및 INDEX DIRECTORY
옵션을 사용합니다.
Windows에서 MyISAM
테이블의 개별 파티션 또는 서브 파티션은 DATA DIRECTORY
및 INDEX DIRECTORY
는 지원되지 않습니다. 이들은 InnoDB
테이블의 개별 파티션 및 하위 파티션에서 지원됩니다 (모든 플랫폼과 마찬가지로).
또한 MAX_ROWS
및 MIN_ROWS
는 각 파티션에있는 행 각각 최대 및 최소 수를 결정하는 데 사용할 수 있습니다. MAX_ROWS
옵션은 MySQL Cluster 테이블을 추가 파티션으로 만들고 해시 인덱스는 큰 스토리지를 확보하는 데 도움이 될 수 있습니다. 자세한 내용은 DataMemory
데이터 노드 구성 매개 변수의 문서 및 섹션 18.1.2 "MySQL Cluster 노드, 노드 그룹 복제 및 파티션" 을 참조하십시오.
파티셔닝의 몇 가지 장점을 보여줍니다.
파티셔닝을 사용하면 단일 디스크 또는 파일 시스템 파티션에 저장할 수있는 데이터보다 많은 데이터를 하나의 테이블에 저장할 수 있습니다.
유효성을 잃은 데이터는 종종 데이터 만 포함되어있는 파티션을 삭제하면 파티션 된 테이블에서 쉽게 삭제할 수 있습니다. 반대로, 새로운 데이터를 추가하는 작업은 데이터만을 포함하는 하나 이상의 새로운 파티션을 추가하여 매우 편리 될 수 있습니다.
지정된
WHERE
절을 충족 데이터를 하나 이상의 파티션 만 저장할 수하여 검색에서 다른 파티션이 자동으로 제외 된 일부 쿼리가 크게 최적화 될 수 있습니다. 파티션은 파티션 된 테이블이 작성된 후 변경 될 수 있으므로, 사용 빈도가 높은 쿼리 (파티셔닝 구성표가 먼저 설정된 경우에는 거의 사용되지 않았다)을 개선하기 위해 데이터를 재구성 수 있습니다. 일치하지 않는 파티션 (및 그들이 포함 된 행)을 제외이 기능은 자주 파티션 가지 치기라고합니다. 자세한 내용은 19.4 절 "파티션 가지 치기" 를 참조하십시오.또한 MySQL 5.6에서는 쿼리에서 명시 적 파티션 선택이 지원됩니다. 예를 들어,
SELECT * FROM t PARTITION (p0,p1) WHERE c < 5
파티션p0
및p1
의WHERE
조건에 일치하는 행만을 선택합니다. 이 경우, MySQL은 테이블t
의 다른 파티션을 확인하지 않습니다. 이는 조사 파티션이 미리 알고있을 때 쿼리 속도를 크게 향상시킬 수 있습니다. 파티션 선택은 데이터 수정 문 (DELETE
,INSERT
,REPLACE
,UPDATE
,LOAD DATA
및LOAD XML
)도 지원됩니다. 자세한 내용 및 예제는 이러한 진술의 설명을 참조하십시오.
보통 파티션과 연관된 다른 장점을 보여줍니다. 이러한 기능은 MySQL 파티셔닝 현재 구현되어 있지 않지만 오라클의 우선 순위 목록의 상위에 있습니다.
SUM()
,COUNT()
같은 집계 함수를 포함하는 쿼리를 쉽게 병렬화 할 수 있습니다. 그런 쿼리의 간단한 예로,SELECT salesperson_id, COUNT(orders) as order_total FROM sales GROUP BY salesperson_id;
를들 수 있습니다. "병렬"하여 쿼리를 각 파티션에서 동시에 실행하고 모든 파티션에서 검색되는 결과를 단순히 통합하는 것만으로 최종 결과를 얻을 수 있음을 의미합니다.여러 디스크에 데이터 탐색을 분산하여 쿼리 처리량이 향상됩니다.
MySQL 파티셔닝 개발은 계속되고 있기 때문에이 섹션 및 장이 업데이트되었는지 여부를 자주 확인하십시오.