MYSQL 5.7 普通表在线转分区表
Posted 客家族_祖仙教_小凡仙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL 5.7 普通表在线转分区表相关的知识,希望对你有一定的参考价值。
当mysql流行5年后,表的数量达到500万,RDS运行时很多SQL都会超过2秒.
在如今互联网业务中,一个页面展现超过10-15秒人们就觉得慢,感觉不耐烦,除非你是GOV的,否则都抛弃你公司,转而使用竞争对手的产品。
为此落实在数据库端的SQL响应时间就缩短到1-5秒时间范围。 目前一个简单的DML操作是规定在1秒之内,而查询一般规定在5秒之内。也就是说给DBA的时间不多了!很显然JAVA开发同学都是赶业务的,开始都是简单地搞起来,哪里想得到日后数量大的情况呢?
为此我们必须上分区。MYSQL也有分区,虽然被人喷得不要不要地。那是自然跟ORACLE分区前辈比了。MYSQL 分区虽然限制多,不过还是可以解决数量过大,很多旧数据业务不需要访问,或者说访问频率非常低。大部分业务访问当前1-3个月的数据。如果做成分区,后端开发工程师再优化下SQL,那么就能解决问题。
普通表的结构 拥有1700万数据 4000MB
CREATE TABLE `account_history` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`guest_no` varchar(30) NOT NULL,
`money` decimal(20,2) NOT NULL COMMENT '余额',
`type` smallint(3) NOT NULL COMMENT '类型',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`before_money` decimal(20,2) DEFAULT NULL COMMENT '改变前余额',
`after_money` decimal(20,2) DEFAULT NULL COMMENT '改变后余额'
PRIMARY KEY (`Id`),
UNIQUE KEY `idx_guest_no` (`guest_no`) USING BTREE,
KEY `create_time_idx` (`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3997619 DEFAULT CHARSET=utf8;
第一步 修改主键 OK 113.219秒
ALTER TABLE account_history DROP PRIMARY KEY, ADD PRIMARY KEY(`id`,`create_time`);
修改后的表结构
CREATE TABLE `account_history` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`guest_no` varchar(30) NOT NULL,
`money` decimal(20,2) NOT NULL,
`type` smallint(3) NOT NULL COMMENT '类型',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`before_money` decimal(20,2) DEFAULT NULL COMMENT '改变前余额',
`after_money` decimal(20,2) DEFAULT NULL COMMENT '改变后余额'
PRIMARY KEY (`Id`,`create_time`),
UNIQUE KEY `idx_guest_no` (`guest_no`) USING BTREE,
KEY `create_time_idx` (`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3997619 DEFAULT CHARSET=utf8;
第二步 在线修改成分区
alter table account_history partition by range(to_days(create_time))
(
PARTITION create_time_20210902 VALUES LESS THAN (to_days('2021-09-02')),
PARTITION create_time_DEFAULTE VALUES LESS THAN MAXVALUE
);
结果都报错:
Error Code: 1503. A UNIQUE INDEX must include all columns in the table's partitioning function'
Error Code: 1503. A UNIQUE INDEX must include all columns in the table's partitioning function'
网上大意是说 主键必须包含分区字段,可是前面已经修改了主键添加了分区字段啊
具体怎么解决 请关注
以上是关于MYSQL 5.7 普通表在线转分区表的主要内容,如果未能解决你的问题,请参考以下文章