mysql根据用户id做分区表

/ 后端 / 没有评论 / 178浏览

现在有一个用户学习日志表,由于数据量比较多,可以选择做分表或分区表;但是在不想改动业务代码的情况下,那么选择分区表,根据user_id分区;

1.表结构如下:

CREATE TABLE `wf_study_log` (
  `id` bigint(20) NOT NULL,
  `user_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `chapter_id` int(11) NOT NULL,
  `study_time` int(11) NOT NULL,
  `time_int` int(11) NOT NULL COMMENT 'yyyyMMdd',
  `year` int(11) NOT NULL,
  `month` int(11) NOT NULL,
  `day` int(11) NOT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `user_sourse` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `user_id` (`user_id`,`chapter_id`,`time_int`),
  KEY `user_id_2` (`user_id`,`course_id`,`year`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.进行分区

直接HASH分区语句:

ALTER TABLE wf_study_log  
PARTITION BY HASH(user_id)  
PARTITIONS 100;

如果直接对user_id进行HASH进行分区会提示错误:

A PRIMARY KEY must include all columns in the table's partitioning function

3.解除问题 出现问题的原因是没有遵循以下要求,user_id仅是唯一索引的一部分,并不是独立的唯一索引;

分区字段必须是表的主键或唯一索引之一;

但是user_id不能设为唯一索引,因为业务需要存储相同user_id的多条数据,所以解决方法是将user_id设为主键,可以与id组成多复合主键;

ALTER TABLE `wf_course_v3`.`wf_study_log` 
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`, `user_id`)

然后执行分区语句即可成功;