>  기사  >  데이터 베이스  >  테이블 파티션을 재구축하고 데이터를 유지하는 mysql 관련 방법에 대한 자세한 설명

테이블 파티션을 재구축하고 데이터를 유지하는 mysql 관련 방법에 대한 자세한 설명

jacklove
jacklove원래의
2018-06-08 15:15:372735검색

이 글에서는 테이블 파티션을 재구축하고 데이터를 유지하는 MySQL의 방법을 소개합니다. 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 데이터베이스 테이블 용량 크기 보기

위 내용은 테이블 파티션을 재구축하고 데이터를 유지하는 mysql 관련 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.