19.6 파티셔닝 제약 및 제한
이 섹션에서는 MySQL 파티셔닝 지원에서 현재의 제약과 한계에 대해 설명합니다.
Prohibited constructs 다음 구조체는 분할 식으로 허용되지 않습니다.
저장 프로 시저 저장 기능, UDF 또는 플러그인.
선언 된 변수 또는 사용자 변수.
분할 식으로 허용되는 SQL 함수의 목록은 섹션 19.6.3 "함수에 대한 파티셔닝 제한" 을 참조하십시오.
Arithmetic and logical operators 산술 연산자 +
, -
, 그리고 *
의 사용은 분할 식으로 허용됩니다. 그러나 결과는 정수 값이나 NULL
이어야합니다 (이 장의 다른 곳에서 설명하고있는 바와 같이, [LINEAR] KEY
파티셔닝의 경우를 제외합니다. 자세한 내용은 섹션 19.2 "파티션 유형" 를 참조하십시오).
DIV
연산자도 지원되지만, /
연산자는 허용되지 않습니다. (Bug # 30188, Bug # 33182).
비트 연산자 |
, &
, ^
, <<
, >>
및 ~
는 분할 표현식에 허용되지 않습니다.
HANDLER statements MySQL 5.6에서는 HANDLER
문은 분할 된 테이블에서 지원되지 않습니다.
Server SQL mode 사용자 정의 파티션을 사용하는 테이블은 그들이 만든 시점에서 유효했던 SQL 모드를 유지하지 않습니다. 섹션 5.1.7 "서버 SQL 모드" 에서 설명한 바와 같이, 많은 MySQL 함수 및 연산자의 결과는 서버 SQL 모드에 따라 변경 될 수 있습니다. 따라서 분할 된 테이블을 만든 후 어느 시점에 SQL 모드를 변경하면 같은 테이블의 동작이 크게 달라질 수 있으며, 데이터 손상 또는 손실이 발생하기 쉬워 질 수 있습니다. 이러한 이유로 파티션 된 테이블을 작성한 후 서버 SQL 모드를 절대 변경하지 않는 것이 좋습니다되어 있습니다.
다음 예제는 서버 SQL 모드를 변경 한 데 따른 파티션 된 테이블의 동작의 변화를 일부 보여줍니다.
오류 처리 다음과 같이 분할식이
,column
DIV 0
등 중 하나 인 분할 된 테이블을 만들려고합니다.column
MOD 0mysql>
CREATE TABLE tn (c1 INT)
->PARTITION BY LIST(1 DIV c1) (
->PARTITION p0 VALUES IN (NULL),
->PARTITION p1 VALUES IN (1)
->);
Query OK, 0 rows affected (0.05 sec)제로로 나눈 결과에 대한 MySQL의 기본 동작은 오류를 발생시키지 않고
NULL
을 반환합니다.mysql>
SELECT @@sql_mode;
+------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) mysql>INSERT INTO tn VALUES (NULL), (0), (1);
Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0그러나 0으로 나누기를 오류로 처리 엄격한 오류 처리를 적용하도록 서버 SQL 모드를 변경하면 다음과 같은
INSERT
문이 실패합니다.mysql>
SET sql_mode='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
Query OK, 0 rows affected (0.00 sec) mysql>INSERT INTO tn VALUES (NULL), (0), (1);
ERROR 1365 (22012): Division by 0테이블 액세스 가능성 서버 SQL 모드를 변경하여 파티션 된 테이블을 사용할 수 없게 될 수 있습니다. 다음의
CREATE TABLE
문은NO_UNSIGNED_SUBTRACTION
모드가 활성화 된 경우에만 성공적으로 실행할 수 있습니다.mysql>
SELECT @@sql_mode;
+------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) mysql>CREATE TABLE tu (c1 BIGINT UNSIGNED)
->PARTITION BY RANGE(c1 - 10) (
->PARTITION p0 VALUES LESS THAN (-5),
->PARTITION p1 VALUES LESS THAN (0),
->PARTITION p2 VALUES LESS THAN (5),
->PARTITION p3 VALUES LESS THAN (10),
->PARTITION p4 VALUES LESS THAN (MAXVALUE)
->);
ERROR 1563 (HY000): Partition constant is out of partition function domain mysql>SET sql_mode='NO_UNSIGNED_SUBTRACTION';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT @@sql_mode;
+-------------------------+ | @@sql_mode | +-------------------------+ | NO_UNSIGNED_SUBTRACTION | +-------------------------+ 1 row in set (0.00 sec) mysql>CREATE TABLE tu (c1 BIGINT UNSIGNED)
->PARTITION BY RANGE(c1 - 10) (
->PARTITION p0 VALUES LESS THAN (-5),
->PARTITION p1 VALUES LESS THAN (0),
->PARTITION p2 VALUES LESS THAN (5),
->PARTITION p3 VALUES LESS THAN (10),
->PARTITION p4 VALUES LESS THAN (MAXVALUE)
->);
Query OK, 0 rows affected (0.05 sec)tu
테이블 을 만든 후에NO_UNSIGNED_SUBTRACTION
서버 SQL 모드를 제거하면이 테이블에 액세스 할 수 없게 될 가능성이 있습니다.mysql>
SET sql_mode='';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT * FROM tu;
ERROR 1563 (HY000): Partition constant is out of partition function domain mysql>INSERT INTO tu VALUES (20);
ERROR 1563 (HY000): Partition constant is out of partition function domain
서버 SQL 모드는 분할 된 테이블의 복제에도 영향을 미칩니다. 마스터와 슬레이브로 SQL 모드가 다르면 파티션식이 달리 평가 될 수 있습니다. 이렇게하면 지정된 테이블의 마스터 복사본와 슬레이브의 복사 파티션 간의 데이터 배분이 달라진다 수 있습니다 마스터에서 성공하는 파티션 된 테이블에 삽입 슬레이브에서 실패 할 수도 있습니다. 최상의 결과를 얻으려면, 마스터와 슬레이브에서 항상 동일한 서버 SQL 모드를 사용하십시오.
성능 고려 사항 파티셔닝 작업의 성능에 미치는 영향의 일부를 다음 목록을 보여줍니다.
File system operations 분할 및 재 파티셔닝 작업 (
PARTITION BY ...
,REORGANIZE PARTITIONS
또는REMOVE PARTITIONING
을 지정한ALTER TABLE
등)는 그 구현의 파일 시스템 작업에 따라 달라집니다. 이것은 이러한 작업의 속도가 파일 시스템의 유형과 특성, 디스크 속도, 스왑 공간, 운영 체제에서 파일 처리 효율 파일 처리 관련 MySQL 서버의 옵션과 변수 등의 요인에 영향을받는 것을 의미합니다. 특히large_files_support
가 활성화되어 있고,open_files_limit
가 제대로 설정되어 있는지 확인하십시오.MyISAM
스토리지 엔진을 사용하는 파티션 된 테이블의 경우myisam_max_sort_file_size
을 늘리면 성능이 향상 될 수 있습니다.innodb_file_per_table
를 활성화함으로써InnoDB
테이블을 사용하는 파티셔닝 및 재 파티셔닝 작업 효율이 향상 될 수 있습니다.파티션의 최대 수 를 참조하십시오.
Table locks 테이블에 파티셔닝 작업을 수행하는 프로세스는 테이블에 쓰기 잠금을 설정합니다. 그런 테이블에서의 읽기는 비교적 영향을받지 않습니다. 보류중인
INSERT
및UPDATE
작업은 파티셔닝 작업이 완료되면 바로 실행됩니다.Storage engine 파티셔닝 작업 쿼리 및 업데이트 작업은 일반적으로
InnoDB
또는NDB
테이블보다MyISAM
테이블에서 빠른 경향이 있습니다.Indexes; partition pruning 분할되지 않은 테이블과 마찬가지로 인덱스를 적절히 사용하여 파티션 된 테이블에 대해 조회 속도를 크게 향상시킬 수 있습니다. 또한 분할 된 테이블 및이 테이블에 대한 쿼리를 partition pruning의 장점을 활용하도록 설계하여 성능을 크게 개선 할 수 있습니다. 자세한 내용은 19.4 절 "partition pruning" 를 참조하십시오.
인덱스 조건문 푸시 다운은 파티션 된 테이블에서 지원되지 않습니다. 섹션 8.2.1.6 "인덱스 조건문 푸시 다운 최적화" 를 참조하십시오.
LOAD DATA의 성능 MySQL 5.6에서는
LOAD DATA
는 성능을 향상시키기 위해 버퍼링을 사용합니다. 이를 실현하기 위해 버퍼가 파티션 당 130K 바이트 메모리를 사용하는 것을 인식하십시오.
파티션의 최대 수 MySQL 5.6.7 이전 버전에서는 NDB
스토리지 엔진을 사용하지 않는 테이블에서 가능한 최대 파티션 수는 1024이었습니다. MySQL 5.6.7 이후,이 제한은 8192 파티션에 증가하고 있습니다. MySQL Server 버전에 관계없이 최대 값은 하위 파티션이 포함됩니다.
NDB
스토리지 엔진을 사용하는 테이블 사용자 정의 파티션의 최대 수는 사용되는 MySQL Cluster 소프트웨어 버전 데이터 노드의 수 및 기타 요인에 따라 달라집니다. 자세한 내용은 NDB 및 사용자 정의 파티셔닝 을 참조하십시오.
다수의 파티션 (단, 최대 수보다 적은)를 가진 테이블을 만들 때 Got error ... from storage engine : Out of resources when opening file 등의 오류 메시지가 나타날 경우 open_files_limit
시스템 변수 값을 늘림으로써이 문제를 해결 할 수 있습니다. 그러나 이것은 운영 체제에 따라 다르기 때문에 모든 플랫폼에서 가능한 또는 권장되는 것은 아닙니다. 자세한 내용은 섹션 B.5.2.18 " 'File'를 찾을 수 없습니다, 그리고 같은 오류" 를 참조하십시오. 경우에 따라서는 다수의 (수백) 파티션을 사용할 수 있으며 문제를 위해 추천되지 않는 경우도 있고, 더 많은 파티션을 사용하는 것이 자동으로 좋은 결과가된다고는 할 수 없습니다.
파일 시스템 작업 을 참조하십시오.
Query cache not supported 쿼리 캐시는 파티션 된 테이블에서 지원되지 않습니다. MySQL 5.6.5 이후 쿼리 캐시는 분할 된 테이블을 사용하는 쿼리에서 자동으로 비활성화 그러한 쿼리에서 사용할 수 없습니다. (Bug # 53775)
Per-partition key caches MySQL 5.6에서는 CACHE INDEX
와 LOAD INDEX INTO CACHE
문을 사용하여 키 캐시가 분할 된 MyISAM
테이블에서 지원됩니다. 키 캐시는 하나, 여러 또는 모든 파티션에 정의 할 하나 여러 또는 모든 파티션의 인덱스를 키 캐시에 미리로드 할 수 있습니다.
Foreign keys not supported for partitioned InnoDB tables InnoDB
스토리지 엔진을 사용하는 파티션 된 테이블에서 외래 키는 지원되지 않습니다. 이것은 구체적으로는 다음의 두 가지 기술이 true임을 의미합니다.
사용자 정의 파티션을 사용하는
InnoDB
테이블의 정의는 외래 키 참조를 포함 할 수 없습니다. 정의에 외부 키 참조가 포함 된InnoDB
테이블은 분할 할 수 없습니다.InnoDB
테이블 정의에 사용자 파티션 된 테이블에 대한 외래 키 참조를 포함 할 수 없습니다. 사용자 정의 파티션을 가진InnoDB
테이블에 외래 키에 의해 참조되는 컬럼을 포함 할 수 없습니다.
위의 제약 범위는 InnoDB
스토리지 엔진을 사용하는 모든 테이블이 포함됩니다. 결과 테이블은 이러한 제약을 위반하는 CREATE TABLE
및 ALTER TABLE
문은 허용되지 않습니다.
ALTER TABLE ... ORDER BY 파티션 된 테이블에 ALTER TABLE ... ORDER BY
문을 실행하면 각 파티션에서만 행이 정렬됩니다. column
기본 키를 변경할에 따르면 REPLACE 문에 미치는 영향 테이블의 기본 키를 변경하는 것이 바람직한 경우가 있습니다 ( 섹션 19.6.1 "파티셔닝 키, 기본 키 및 고유 키" 를 참조하십시오). REPLACE
문을 사용하는 응용 프로그램에서 이렇게하면 이러한 진술의 결과가 크게 달라질 수 있음을 인식하십시오. 자세한 내용 및 예제는 섹션 13.2.8 "REPLACE 구문" 을 참조하십시오.
FULLTEXT 인덱스 파티션 된 테이블은 InnoDB
또는 MyISAM
스토리지 엔진을 사용하는 파티션 된 테이블에서도 FULLTEXT
인덱스 또는 검색을 지원하지 않습니다.
Spatial 컬럼 POINT
, GEOMETRY
등의 공간 데이터 형식을 갖는 열은 분할 된 테이블에서 사용할 수 없습니다.
Temporary 테이블 임시 테이블은 파티션 할 수 없습니다 (Bug # 17497).
Log 테이블 로그 테이블을 분할 할 수 없습니다. 그런 테이블에 ALTER TABLE ... PARTITION BY ...
문을 실행하면 오류와 함께 실패합니다.
Data type of partitioning key 파티셔닝 키는 정수 컬럼 또는 정수에 해결되는 식이어야합니다. ENUM
컬럼을 사용하는 식은 사용할 수 없습니다. 열 또는式値는 NULL
이 될 수 있습니다 ( 섹션 19.2.7 "MySQL 파티셔닝에 의한 NULL 처리" 를 참조하십시오).
이 제한에는 두 가지 예외가 있습니다.
[LINEAR] KEY
에 의해 파티셔닝 할 때는TEXT
또는BLOB
이외의 유효한 MySQL 데이터 유형의 컬럼을 파티셔닝 키로 사용할 수 있습니다. MySQL의 내부 키 해시 함수에 의해 이러한 형태에서 올바른 데이터 형식이 생성되기 때문입니다. 예를 들어, 다음의 2 개의CREATE TABLE
문은 유효합니다.CREATE TABLE tkc (c1 CHAR) PARTITION BY KEY(c1) PARTITIONS 4; CREATE TABLE tke ( c1 ENUM('red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet') ) PARTITION BY LINEAR KEY(c1) PARTITIONS 6;
RANGE COLUMNS
또는LIST COLUMNS
의해 분할 할 때, 문자열,DATE
및DATETIME
컬럼을 사용할 수 있습니다. 예를 들어, 다음 각CREATE TABLE
문은 유효합니다.CREATE TABLE rc (c1 INT, c2 DATE) PARTITION BY RANGE COLUMNS(c2) ( PARTITION p0 VALUES LESS THAN('1990-01-01'), PARTITION p1 VALUES LESS THAN('1995-01-01'), PARTITION p2 VALUES LESS THAN('2000-01-01'), PARTITION p3 VALUES LESS THAN('2005-01-01'), PARTITION p4 VALUES LESS THAN(MAXVALUE) ); CREATE TABLE lc (c1 INT, c2 CHAR(1)) PARTITION BY LIST COLUMNS(c2) ( PARTITION p0 VALUES IN('a', 'd', 'g', 'j', 'm', 'p', 's', 'v', 'y'), PARTITION p1 VALUES IN('b', 'e', 'h', 'k', 'n', 'q', 't', 'w', 'z'), PARTITION p2 VALUES IN('c', 'f', 'i', 'l', 'o', 'r', 'u', 'x', NULL) );
위의 예외는 BLOB
또는 TEXT
컬럼 형에 적용되지 않습니다.
서브 쿼리 파티셔닝 키는 서브 쿼리 할 수 없습니다 (그 서브 쿼리가 정수 값 또는 NULL
로 해결되는 경우).
서브 파티션 문제 하위 파티션은 HASH
또는 KEY
파티셔닝을 사용해야합니다. 서브 파티셔닝 할 수 RANGE
및 LIST
파티션뿐입니다. HASH
및 KEY
파티션은 하위 파티션 할 수 없습니다.
현재 SUBPARTITION BY KEY
는 서브 파티셔닝 컬럼을 명시 적으로 지정해야하지만 PARTITION BY KEY
의 경우는 생략 할 수 있습니다 (이 경우 테이블의 프라이 머리 키 컬럼이 기본적으로 사용됩니다) 다음 문에 의해 생성 된 테이블이 있다고합니다.
CREATE TABLE ts ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) );
다음과 같은 명령문을 사용하여 KEY
에 의해 분할 된 동일한 컬럼을 가진 테이블을 만들 수 있습니다.
CREATE TABLE ts ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) ) PARTITION BY KEY() PARTITIONS 4;
이전 문은 다음과 같이 기술되어있는 것처럼 취급됩니다 (테이블의 프라이 머리 키 컬럼이 파티셔닝 컬럼으로 사용됩니다).
CREATE TABLE ts ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) ) PARTITION BY KEY(id) PARTITIONS 4;
그러나 다음 문은 기본 컬럼을 서브 파티셔닝 컬럼으로 사용하는 서브 분할 된 테이블을 만들려고하는 데 실패합니다. 이 문이 성공하려면 다음과 같이 컬럼을 지정해야합니다.
mysql>CREATE TABLE ts (
->id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->name VARCHAR(30)
->)
->PARTITION BY RANGE(id)
->SUBPARTITION BY KEY()
->SUBPARTITIONS 4
->(
->PARTITION p0 VALUES LESS THAN (100),
->PARTITION p1 VALUES LESS THAN (MAXVALUE)
->);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') mysql>CREATE TABLE ts (
->id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
->name VARCHAR(30)
->)
->PARTITION BY RANGE(id)
->SUBPARTITION BY KEY(id)
->SUBPARTITIONS 4
->(
->PARTITION p0 VALUES LESS THAN (100),
->PARTITION p1 VALUES LESS THAN (MAXVALUE)
->);
Query OK, 0 rows affected (0.07 sec)
이것은 알려진 문제입니다 (Bug # 51470를 참조하십시오).
DELAYED option not supported INSERT DELAYED
를 사용하여 파티션 된 테이블에 행을 삽입하는 것은 지원되지 않습니다. 이를 시도하면 오류와 함께 실패합니다.
DATA DIRECTORY 및 INDEX DIRECTORY 옵션 DATA DIRECTORY
및 INDEX DIRECTORY
는 파티션 된 테이블에서 사용할 때 다음과 같은 제한이 적용됩니다.
테이블 수준
DATA DIRECTORY
및INDEX DIRECTORY
옵션은 무시됩니다 (Bug # 32091를 참조하십시오).Windows에서
DATA DIRECTORY
및INDEX DIRECTORY
옵션은MyISAM
테이블의 개별 파티션 또는 서브 파티션에서 지원되지 않습니다 (Bug # 30459). 그러나InnoDB
테이블의 개별 파티션 또는 서브 파티션은DATA DIRECTORY
를 사용할 수 있습니다.
Repairing and rebuilding partitioned tables 명령문 CHECK TABLE
, OPTIMIZE TABLE
, ANALYZE TABLE
및 REPAIR TABLE
이 분할 된 테이블에서 지원됩니다.
또한 ALTER TABLE ... REBUILD PARTITION
을 사용하여 파티션 된 테이블의 하나 이상의 파티션을 재구성 할 수 있습니다. ALTER TABLE ... REORGANIZE PARTITION
에도 파티션이 재구성됩니다. 이 두 문장의 자세한 내용은 섹션 13.1.7 "ALTER TABLE 구문" 을 참조하십시오.
mysqlcheck, myisamchk 및 myisampack는 파티션 된 테이블에서 지원되지 않습니다.
FOR EXPORT 옵션 (FLUSH TABLES) FLUSH TABLES
문 FOR EXPORT
옵션은 MySQL 5.6.16 이전의 분할 된 InnoDB
테이블에서는 지원되지 않습니다 (Bug # 16943907).