分享更有价值
被信任是一种快乐

MySQL普通表如何转换成分区表

文章页正文上

小编给大家分享一下MySQL普通表如何转换成分区表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
以jxfp_data_bak表为例:
mysql> desc jxfp_data_bak;
+————-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————-+————–+——+—–+———+—————-+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| SH | varchar(32) | YES | | NULL | |
| KPJH | varchar(32) | YES | | NULL | |
| ZFJH | varchar(10) | YES | | NULL | |
| TYPE | char(3) | YES | | NULL | |
| MONTH | char(10) | YES | | NULL | |
| STATUS | varchar(255) | YES | MUL | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| FP_DATA | mediumtext | YES | | NULL | |
+————-+————–+——+—–+———+—————-+
10 rows in set (0.00 sec)

方法1:用alter table table_name partition by命令重建分区表

mysql> alter table jxfp_data_bak PARTITION BY KEY(SH) PARTITIONS 8;
ERROR 15免费主机域名03 (HY000): A PRIMARY KEY must include all columns in the table’s partitioning function

直接增加主键会报错:
mysql> alter table jxfp_data_bak add PRIMARY KEY(SH);
ERROR 1068 (42000): Multiple primary key defined

需要删除原先的主键,并增加联合主键:
mysql> ALTER TABLE `jxfp_data_bak` DROP PRIMARY KEY, ADD PRIMARY KEY(`id`,`SH`);

查看新的表结构:
mysql> desc jxfp_data_bak;
+————-+————–+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————-+————–+——+—–+———+—————-+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| SH | varchar(32) | NO | PRI | | | –SH列为联合主键
| KPJH | varchar(32) | YES | | NULL | |
| ZFJH | varchar(10) 免费主机域名| YES | | NULL | |
| TYPE | char(3) | YES | | NULL | |
| MONTH | char(10) | YES | | NULL | |
| STATUS | varchar(255) | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| FP_DATA | mediumtext | YES | | NULL | |
+————-+————–+——+—–+———+—————-+
10 rows in set (0.00 sec)

用alter table table_name partition by命令重建分区表:
建hash分区会报错,因为hash分区字段只能是整型,不能是varchar型:
mysql> alter table jxfp_data_bak PARTITION BY HASH(SH) PARTITIONS 8;
ERROR 1659 (HY000): Field ‘SH’ is of a not allowed type for this type of partitioning

但建key分区则可以成功:
mysql> alter table jxfp_data_bak PARTITION BY KEY(SH) PARTITIONS 8;
Query OK, 78317 rows affected (3.42 sec)
Records: 78317 Duplicates: 0 Warnings: 0

测试分区功能:
mysql> explain partitions select * from jxfp_data_bak;
+—-+————-+—————+————————-+——+—————+——+———+——+——-+——-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+—————+————————-+——+—————+——+———+——+——-+——-+
| 1 | SIMPLE | jxfp_data_bak | p0,p1,p2,p3,p4,p5,p6,p7 | ALL | NULL | NULL | NULL | NULL | 43588 | NULL |
+—-+————-+—————+————————-+——+—————+——+———+——+——-+——-+
1 row in set (0.00 sec)

以上我们可以看到全表扫描跨越了七个分区(p0–p7),说明分区表功能生效。

方法2:利用create table命令重建分区表

mysql> CREATE TABLE `jxfp_data` (
-> `id` bigint(20) NOT NULL AUTO_INCREMENT,
-> `SH` varchar(32) DEFAULT NULL COMMENT ‘税号’,
-> `KPJH` varchar(32) DEFAULT NULL COMMENT ‘开票机号’,
-> `ZFJH` varchar(10) DEFAULT NULL COMMENT ‘主分机号’,
-> `TYPE` char(3) DEFAULT NULL,
-> `MONTH` char(10) DEFAULT NULL,
-> `STATUS` varchar(255) DEFAULT NULL COMMENT ‘解析状态标识’,
-> `CREATE_TIME` datetime DEFAULT NULL COMMENT ‘插入时间’,
-> `UPDATE_TIME` datetime DEFAULT NULL COMMENT ‘更新时间’,
-> `FP_DATA` mediumtext COMMENT ‘发票数据’,
-> PRIMARY KEY (`id`,`SH`)
-> ) ENGINE=InnoDB AUTO_INCREMENT=81060 DEFAULT CHARSET=utf8 PARTITION BY LINEAR KEY (SH) PARTITIONS 8;
Query OK, 0 rows affected (0.08 sec) –创建分区表成功

注意:如果原表里有主键字段,则MYSQL的分区字段必须包含在主键字段内,否则会创建失败,因此上面需要定义两个联合主键(`id`,`SH`)

插回数据:
mysql> insert into jxfp_data select * from ixinnuo_sjcj.jxfp_data;
Query OK, 745540 rows affected, 1 warning (28.21 sec)
Records: 745540 Duplicates: 0 Warnings: 1

测试:
mysql> explain partitions select * from jxfp_data;
+—-+————-+———–+————————-+——+—————+——+———+——+——–+——-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+———–+————————-+——+—————+——+———+——+——–+——-+
| 1 | SIMPLE | jxfp_data | p0,p1,p2,p3,p4,p5,p6,p7 | ALL | NULL | NULL | NULL | NULL | 695986 | NULL |
+—-+————-+———–+————————-+——+—————+——+———+——+——–+——-+
1 row in set (0.00 sec)
以上是“MySQL普通表如何转换成分区表”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注云技术行业资讯频道!

相关推荐: mysql中怎么用数字辅助表补录数据一则

这篇文章给大家分享的是有关mysql中怎么用数字辅助表补录数据一则的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 结构:create table user_baseinfo( userid bigint not null prima…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册