• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

介绍mysql重建表分区并保留数据的方法

php 搞代码 4年前 (2022-01-22) 26次浏览 已收录 0个评论

本文介绍mysql重建表分区并保留数据的方法,mysql的表分区(partition)可以把一个表的记录分开多个区去存储,查询时可根据查询的条件在对应的分区搜寻,而不需要整表查询,提高查询效率。

有分区的表与没有分区的表使用上没有太大的区别,但如果要对表进行重新分区,删除分区重建会删除数据,因此不可直接进行操作,需要使用一些特别的处理实现。

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 '内容', <strong>*本文来源gaodai#ma#com搞@代~码^网+</strong><strong>搞代gaodaima码</strong>`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.将log的数据复制到log2

insert into `log2` select * from `log`;

3.删除log表

drop table `log`;

4.将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 |+----------------+------------+

可以看到log表的数据已经按新分区存储。

本文介绍mysql重建表分区并保留数据的方法,更多相关内容请随时关注我们网站!

相关推荐:

php json_encode不支持对象私有属性的解决方法

PHP生成唯一RequestID类的相关内容

js 基础 数据类型及转换 进制 操作符


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:介绍mysql重建表分区并保留数据的方法
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址