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 普通表在线转分区表的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 5.7 普通表在线转分区表

MYSQL 5.7 普通表在线转分区表

oracle普通表转分区表(在线重定义方式)

(转)一个MySQL 5.7 分区表性能下降的案例分析

Oracle在线重定义(online redefinition)--将普通表改为分区表

使用DBMS_REDEFINITION在线切换普通表到分区表