mysql新建分表后,入库之前分表区间的数据,但是再分表中查询不到对应数据。
文章目录
- 问题背景
- 问题解析
- 新建分区sql
- 查看分区
- 查询数据
- 查询数据所在分区
 
- 修改方案
- 总结
- LESS THAN
- 相关sql
- 查询分区
- 删除分区
- 先建分区
 
 
问题背景
初始化表的时候,先建的日期分区分2022年的表,新的一年需要重新建分表。在执行脚本后,建了2023年的12个分区。新增了1月份的数据后,入库成功,主表添加日期筛选可以查询全部数据,在1月分表中查询为空。
问题解析
新建分区sql
ALTER TABLE fact_task_analyst
 ADD PARTITION (PARTITION fact_task_analyst_202301 VALUES LESS THAN (20230101));
ALTER TABLE fact_task_analyst
 ADD PARTITION (PARTITION fact_task_analyst_202302 VALUES LESS THAN (20230201));
查看分区
SELECT * from information_schema.PARTITIONS
where table_schema = schema()
and table_name = 'fact_task_analyst'

查询数据
查询主表数据通过分区主键查询可以查到全部数据
 
 查询_202301分表数据是空的。
 
查询数据所在分区
使用EXPLAIN可以看到20230107的数据存在了202302的分分表,数量为124条。
 
 然后去查了202302的分表依旧是空的。
 
 所以猜想大概就是在建分区有问题。
 重新查看了建分区sql。发下再给分区设置 less than的时候,202301分区设置的是20230101。
 
修改方案
把一月的分区的less than 改成20230201,改为一月的阈值。
	ALTER TABLE fact_task_analyst
	ADD PARTITION (PARTITION fact_task_analyst_202301 VALUES LESS THAN (20230201));
ALTER TABLE fact_task_analyst
	ADD PARTITION (PARTITION fact_task_analyst_202302 VALUES LESS THAN (20230301));
重新插入数据后,通过分表可以查询出来。
 
总结
LESS THAN
VALUES LESS THAN 分区最大值( “<” )。设置分区的最大阈值,而不是初始值。
相关sql
查询分区
-- 查看分区情况
SELECT * from information_schema.PARTITIONS
where table_schema = schema()
and table_name = '表'
删除分区
-- 删除分区表
alter table 主表 drop PARTITION 分区名;
先建分区
-- 新建分区
ALTER TABLE 主表
	ADD PARTITION (PARTITION 分区 VALUES LESS THAN (最大阈值));



















