데이터 분할 - Mysql 파 티 션 시트 관리 및 유지보수

Mysql 파 티 션 시트 에 대한 소 개 는 참고 할 수 있 습 니 다.
        http://blog.csdn.net/jhq0113/article/details/44592865
       Mysql 파 티 션 시트 생 성 에 대해 참고 할 수 있 습 니 다:
       http://blog.csdn.net/jhq0113/article/details/44593511
       앞에서 언급 했 듯 이 Mysql 은 4 가지 표 의 파 티 션 을 지원 합 니 다. 즉, RANGE 와 LIST, HASH 와 KEY 입 니 다. 그 중에서 RANGE 와 LIST 는 비슷 하고 한 구간 에 따라 파 티 션 을 진행 합 니 다. HASH 는 KEY 와 유사 하 며 특정한 알고리즘 에 따라 필드 를 구분 합 니 다.
       RANGE 와 LIST 구역 관리:
       사례: 채 팅 기록 표 가 있 는데 사용자 가 수천 명 정도 되 고 표 에 대해 사용자 에 따라 일정한 입도 의 수준 으로 분할 되 었 습 니 다. 현 재 는 일부 표 에 저 장 된 기록 이 비교적 많 기 때문에 다음 과 같은 방식 으로 표 에 대해 구역 을 나 누 었 습 니 다. 구역 의 장점 은 구역 을 동적 으로 바 꿀 수 있 고 구역 을 삭제 한 후에 데이터 도 함께 삭 제 됩 니 다. 예 를 들 어 채 팅 기록 은 2 년 만 저장 할 수 있 습 니 다.그러면 시간 에 따라 구역 을 나 누고 2 년 전의 구역 을 정기 적 으로 삭제 할 수 있 으 며 동적 으로 새로운 구역 을 만 들 면 좋 은 데이터 유 지 를 할 수 있다.
  
       파 티 션 시트 에서 만 든 문 구 는 다음 과 같 습 니 다.
        
DROP TABLE IF EXISTS `msgss`;
CREATE TABLE `msgss` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '   ',
  `sender` int(10) unsigned NOT NULL COMMENT '   ID',
  `reciver` int(10) unsigned NOT NULL COMMENT '   ID',
  `msg_type` tinyint(3) unsigned NOT NULL COMMENT '    ',
  `msg` varchar(225) NOT NULL COMMENT '    ',
  `atime` int(10) unsigned NOT NULL COMMENT '    ',
  `sub_id` tinyint(3) unsigned NOT NULL COMMENT '  ID',
  PRIMARY KEY (`id`,`atime`,`sub_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
/*********    **************/
PARTITION BY RANGE (atime) SUBPARTITION BY HASH (sub_id) 
(
		PARTITION t0 VALUES LESS THAN(1451577600)
		(
			SUBPARTITION s0,
			SUBPARTITION s1,
			SUBPARTITION s2,
			SUBPARTITION s3,
			SUBPARTITION s4,
			SUBPARTITION s5
		),
		PARTITION t1 VALUES LESS THAN(1483200000)
		(
			SUBPARTITION s6,
			SUBPARTITION s7,
			SUBPARTITION s8,
			SUBPARTITION s9,
			SUBPARTITION s10,
			SUBPARTITION s11
		),
		PARTITION t2 VALUES LESS THAN MAXVALUE
		(
			SUBPARTITION s12,
			SUBPARTITION s13,
			SUBPARTITION s14,
			SUBPARTITION s15,
			SUBPARTITION s16,
			SUBPARTITION s17
		)
);

        상기 문 구 는 RANGE 에 따라 구 분 된 세 개의 메 인 파 티 션 을 만 들 었 고 각 메 인 파 티 션 아래 에 HASH 에 따라 구 분 된 여섯 개의 하위 파 티 션 이 있 습 니 다.
        테스트 데이터 삽입:
       
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH',UNIX_TIMESTAMP(NOW()),1);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 2',UNIX_TIMESTAMP(NOW()),2);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 3',UNIX_TIMESTAMP(NOW()),3);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 10',UNIX_TIMESTAMP(NOW()),10);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 7',UNIX_TIMESTAMP(NOW()),7);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 5',UNIX_TIMESTAMP(NOW()),5);

INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH',1451577607,1);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 2',1451577609,2);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 3',1451577623,3);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 10',1451577654,10);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 7',1451577687,7);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 5',1451577699,5);

INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH',1514736056,1);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 2',1514736066,2);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 3',1514736076,3);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 10',1514736086,10);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 7',1514736089,7);
INSERT INTO `msgss`(`sender`,`reciver`,`msg_type`,`msg`,`atime`,`sub_id`) VALUES(1,2,0,'Hello HASH 5',1514736098,5);

                 
파 티 션 분석 진행:
        EXPLAIN PARTITIONS SELECT * FROM msgss;
        파 티 션 정 보 를 다음 과 같이 감지 할 수 있 습 니 다.
         
         검출 구역 데이터 분포:
         
EXPLAIN PARTITIONS SELECT * FROM msgss WHERE `atime`<1451577600;

EXPLAIN PARTITIONS SELECT * FROM msgss WHERE `atime`>1451577600 AND `atime`<1483200000;

EXPLAIN PARTITIONS SELECT * FROM msgss WHERE `atime`>1483200000 AND `atime`<1514736000;

EXPLAIN PARTITIONS SELECT * FROM msgss WHERE `atime`>1514736000;

                   
결과: 첫 번 째 문 구 는 t0 의 모든 하위 구역 만 스 캔 했 고 두 번 째 문 구 는 t1 의 모든 하위 구역 만 스 캔 했 으 며 세 번 째 네 번 째 문 구 는 각각 t2 의 모든 하위 구역 만 스 캔 하여 표 의 구역 과 데이터 분포 가 성공 적 임 을 증명 했다.
         수요: 현재 2017 년 이 므 로 2015 년 의 모든 채 팅 기록 을 삭제 해 야 하지만 2016 년 의 채 팅 기록 을 보류 하고 2017 년 의 데이터 도 정상적으로 구역 별로 저장 할 수 있 습 니 다.
        상기 수 요 를 실현 하려 면 두 단계 가 필요 합 니 다. 첫 번 째 단 계 는 t0 구역 을 삭제 하고 두 번 째 단 계 는 새로운 규칙 에 따라 구역 을 재 구축 해 야 합 니 다.
        파 티 션 구문 삭제:
        ALTER TABLE `msgss` DROP PARTITION t0;
        파 티 션 구문 재 구축:
       
ALTER TABLE `msgss` PARTITION BY RANGE (atime) SUBPARTITION BY HASH (sub_id) 
(
		PARTITION t0 VALUES LESS THAN(1483200000)
		(
			SUBPARTITION s0,
			SUBPARTITION s1,
			SUBPARTITION s2,
			SUBPARTITION s3,
			SUBPARTITION s4,
			SUBPARTITION s5
		),
		PARTITION t1 VALUES LESS THAN(1514736000)
		(
			SUBPARTITION s6,
			SUBPARTITION s7,
			SUBPARTITION s8,
			SUBPARTITION s9,
			SUBPARTITION s10,
			SUBPARTITION s11
		),
		PARTITION t2 VALUES LESS THAN MAXVALUE
		(
			SUBPARTITION s12,
			SUBPARTITION s13,
			SUBPARTITION s14,
			SUBPARTITION s15,
			SUBPARTITION s16,
			SUBPARTITION s17
		)
);

                   
조회 결과 15 년 간 의 데 이 터 는 모두 삭제 되 었 고 나머지 데 이 터 는 다시 구역 을 나 누 어 분포 되 었 다.
         미완이다
       

좋은 웹페이지 즐겨찾기