MySQL RANGE columns多列范围分区数据插入分区不符异常求助
MySQL分区异常原因分析
核心问题是你对RANGE COLUMNS多列分区的比较规则理解有误,MySQL的多列RANGE COLUMNS分区采用逐列优先匹配规则,而非先匹配首列等值再比较次列。
具体规则逻辑
判断数据所属分区时,会按分区声明的列顺序逐列比较:
- 若待插入数据的当前列值 小于 分区上界的对应列值,直接判定数据满足该分区的
LESS THAN条件,不再比较后续列 - 只有当待插入数据的当前列值 等于 分区上界的对应列值时,才会继续比较下一列的大小
对应你的场景验证
你插入的数据为(c_id=1, created='2021-10-24 18:16:08'),两个分区的上界首列值都是2:
- 优先比较
c_id,1 < 2,直接满足第一个分区logs_1_2020的VALUES LESS THAN (2,'2021-01-01 00:00:00')条件 - 不会再比较
created字段的大小,所以数据直接落入logs_1_2020分区,而非你预期的logs_1_2021。
修复方案参考
如果你要实现c_id相同的场景下按created年份分区,需要调整分区上界的首列值匹配你要拆分的c_id,示例:
PARTITION BY RANGE columns (c_id,created)( -- c_id=1的按年分区 PARTITION logs_1_2020 VALUES LESS THAN (1,'2021-01-01 00:00:00'), PARTITION logs_1_2021 VALUES LESS THAN (1,'2022-01-01 00:00:00'), -- c_id=2的按年分区 PARTITION logs_2_2020 VALUES LESS THAN (2,'2021-01-01 00:00:00'), PARTITION logs_2_2021 VALUES LESS THAN (2,'2022-01-01 00:00:00') );
内容的提问来源于stack exchange,提问作者es code
相关产品推荐
相关产品推荐

