2017-09-12 1 views
0

약 2Mln 개의 레코드가있는 큰 테이블이 있는데이를 파티션하고 싶습니다.MySQL의 파티션 - 기본 키 및 고유 레코드의 오류

ID 열이 PRIMARY AUTO_INCREMENT int (항상 고유해야 함)입니다. 대부분의 쿼리가 WHERE 문을 1 년에 한 번 사용하기 때문에 2016 년에서 2050 년까지 BY RANGE로 분할하려면 "theyear"int (4) 열을 사용했습니다.

파티셔닝 할 때 "myear"키가 PRIMARY KEY 여야한다는 오류가 발생하므로 PRIMARY (id, theyear)라는 다중 컬럼 키를 사용하는 기본 키를 편집했습니다.

그것은 모든 OK, 그러나 그것은 "theyear"열을 확인하기 때문에 내 "ID"열이 더 이상 고유하지 않습니다 너무 ... 나는 삽입 그래서 경우 :

INSERT INTO table (id, theyear) VALUES (1, 2016); 
INSERT INTO table (id, theyear) VALUES (1, 2017); 

그것은 때문에 오류를 말한다 UNIQUE는 id와 theyear를 모두 확인합니다.

"id"열에서 UNIQUE를 잃지 않고 어떻게 분할을 구현할 수 있습니까?

감사합니다.

+0

연도에 대해 별도의 'unique' 제약 조건을 추가하려 했습니까? – cwallenpoole

+0

나는이 문서를 기초로하고있다 : https://dev.mysql.com/doc/refman/5.7/en/partitioning-range.html,하지만 당신이 기본 키를 변경할 필요가 없다고 생각한다. RANGE 파티션. 그들이 사용하는 모든 예제에는 기본 키가 없습니다. 내가 놓친 게 있니? KEY()로 실수로 파티션을 분할하려고합니까? –

+0

왜 분할 하시겠습니까? 어떤 쿼리가 더 빨리 실행될 것이라고 생각합니까? 그 쿼리와'SHOW CREATE TABLE'을 제공하십시오. 아마도 적절한 색인은 파티셔닝이 빠르거나 빠를 것이라고 주장 할 것입니다. 아마 색인은 YEAR로 시작할 것입니다. 힌트 : http://mysql.rjweb.org/doc.php/partitionmaint –

답변

0

쿼리에 theyear이 사용되므로 RANGE를 기준으로 파티셔닝하면 적절한 INDEX와 함께 대용량 데이터가 도움이됩니다.

유지, KEY() partitionning를 사용하지 마십시오 기본 키

INDEX IDX_theyear(theyear) 

예를 들어
PARTITION BY RANGE (theyear) ( 
PARTITION p0 VALUES LESS THAN (2017), 
PARTITION p1 VALUES LESS THAN (2018), 
PARTITION p2 VALUES LESS THAN (2019), 
PARTITION p3 VALUES LESS THAN (2020) 

기존. 나중에 더 많은 파티션을 추가 할 수 있지만 더 세게 설치할 수 있습니다. 데이터가 오래되면 분명히 가장 오래된 연도부터 시작하십시오.

+0

"# 1503 - PRIMARY KEY는 테이블의 파티셔닝에 모든 컬럼을 포함해야합니다 함수 "라고 말하면서 ... –

+0

전체 테이블 생성 코드를 붙이시겠습니까? –