이 글에서는 테이블 파티션을 재구축하고 데이터를 유지하는 MySQL의 방법을 소개합니다. MySQL 테이블 파티션(파티션)은 테이블의 레코드를 여러 영역으로 분리하여 저장할 수 있습니다. 쿼리 시 해당 파티션에서 검색할 수 있습니다. 쿼리 조건 없이 쿼리 효율성을 높이려면 테이블 전체를 쿼리해야 합니다.
파티션된 테이블과 파티션이 없는 테이블을 사용하면 큰 차이가 없지만 테이블을 다시 파티셔닝하려는 경우 파티션을 삭제하고 다시 빌드하면 데이터가 삭제되므로 직접 조작할 수 없으며 일부 특수 처리를 수행해야 합니다. 달성이 필요합니다.
1. 원본 테이블과 동일한 구조로 새 테이블과 새 파티션을 만듭니다.
2. 원본 테이블의 데이터를 새 테이블에 복사합니다.
3. 원본 테이블을 삭제하세요.
4. 새 테이블 이름을 원래 테이블 이름으로 변경합니다.
로그 테이블의 원래 구조는 id별로 구분되어 있습니다.
CREATE DATABASE `test`;use `test`;CREATE TABLE `log` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '内容', `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态', `addtime` int(11) unsigned NOT NULL COMMENT '添加时间', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (id) (PARTITION p10w VALUES LESS THAN (100000) ENGINE = InnoDB, PARTITION p20w VALUES LESS THAN (200000) ENGINE = InnoDB, PARTITION p50w VALUES LESS THAN (500000) ENGINE = InnoDB, PARTITION p100w VALUES LESS THAN (1000000) ENGINE = InnoDB, PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;insert into `log`(content,status,addtime,lastmodify) values('content1',1, unix_timestamp('2018-01-11 00:00:00'), unix_timestamp('2018-01-11 00:00:00')), ('content2',1, unix_timestamp('2018-02-22 00:00:00'), unix_timestamp('2018-02-22 00:00:00')), ('content3',1, unix_timestamp('2018-03-31 00:00:00'), unix_timestamp('2018-03-31 00:00:00'));
데이터 파티션 분포 보기
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+| PARTITION_NAME | TABLE_ROWS | +----------------+------------+| p10w | 3 | | p20w | 0 | | p50w | 0 | | p100w | 0 || pmax | 0 | +----------------+------------+
로그 데이터는 시간별로 검색해야 하므로 로그 시간별로 파티션을 다시 구성해야 합니다.
1. log2를 생성하고 시간별로 파티션을 나눕니다(월 1개 파티션)
CREATE TABLE `log2` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `content` text NOT NULL COMMENT '内容', `status` tinyint(3) unsigned NOT NULL COMMENT '记录状态', `addtime` int(11) unsigned NOT NULL COMMENT '添加时间', `lastmodify` int(11) unsigned NOT NULL COMMENT '最后修改时间', PRIMARY KEY (`id`,`addtime`), KEY `id`(`id`), KEY `addtime`(`addtime`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (addtime) (PARTITION p201801 VALUES LESS THAN (unix_timestamp('2018-02-01 00:00:00')) ENGINE = InnoDB, PARTITION p201802 VALUES LESS THAN (unix_timestamp('2018-03-01 00:00:00')) ENGINE = InnoDB, PARTITION p201803 VALUES LESS THAN (unix_timestamp('2018-04-01 00:00:00')) ENGINE = InnoDB, PARTITION p201804 VALUES LESS THAN (unix_timestamp('2018-05-01 00:00:00')) ENGINE = InnoDB, PARTITION pmax VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */;
2. 로그 데이터를 log2에 복사합니다.
insert into `log2` select * from `log`;
3. 로그 테이블 삭제
drop table `log`;
. log2 테이블의 이름을 log
rename table `log2` to `log`;
로 변경합니다.
실행 후 데이터 파티션 분포를 확인합니다
SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME = 'log';+----------------+------------+| PARTITION_NAME | TABLE_ROWS | +----------------+------------+| p201801 | 1 | | p201802 | 1 | | p201803 | 1 | | p201804 | 0 || pmax | 0 | +----------------+------------+
로그 테이블의 데이터가 새로운 파티션에 저장되는 것을 확인할 수 있습니다.
이 기사에서는 테이블 파티션을 재구축하고 데이터를 유지하는 MySQL의 관련 방법을 설명합니다. 더 많은 관련 지식을 보려면 PHP 중국어 웹사이트를 참고하세요.
관련 권장사항:
객체 전용 속성을 지원하지 않는 PHP json_encode에 대한 설명
고유한 RequestID 클래스 관련 콘텐츠를 생성하는 PHP에 대한 설명
위 내용은 테이블 파티션을 재구축하고 데이터를 유지하는 mysql 관련 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!