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 (最大阈值));