描述
月报是根据日报的数据统计出来的,但是今天早上发现月报没有数据,日报是有数据的,那么为什么会导致这个结果呢?
问题解决
设计
因为日报table_day每天的数据量都在60w+,所以我们采用了分区的形式,进行存储,存储的规则如下:
PARTITION p40 VALUES LESS THAN (739251) ENGINE = MyISAM,PARTITION p41 VALUES LESS THAN (739282) ENGINE = MyISAM,PARTITION p42 VALUES LESS THAN (739311) ENGINE = MyISAM,PARTITION p43 VALUES LESS THAN (739342) ENGINE = MyISAM,PARTITION p44 VALUES LESS THAN (739372) ENGINE = MyISAM,PARTITION p45 VALUES LESS THAN (739403) ENGINE = MyISAM,PARTITION p46 VALUES LESS THAN (739433) ENGINE = MyISAM,PARTITION p47 VALUES LESS THAN (739464) ENGINE = MyISAM,PARTITION p48 VALUES LESS THAN (739495) ENGINE = MyISAM,PARTITION p49 VALUES LESS THAN (739525) ENGINE = MyISAM,PARTITION p50 VALUES LESS THAN (739556) ENGINE = MyISAM,PARTITION p51 VALUES LESS THAN (739586) ENGINE = MyISAM,PARTITION p52 VALUES LESS THAN (739617) ENGINE = MyISAM,PARTITION p53 VALUES LESS THAN (739648) ENGINE = MyISAM,PARTITION p54 VALUES LESS THAN (739676) ENGINE = MyISAM,PARTITION p55 VALUES LESS THAN (739707) ENGINE = MyISAM,PARTITION p56 VALUES LESS THAN (739737) ENGINE = MyISAM,PARTITION p57 VALUES LESS THAN (739768) ENGINE = MyISAM,PARTITION p58 VALUES LESS THAN (739798) ENGINE = MyISAM,
上述语句的意思是,对于如果有数据进入table_day,他会根据这条数据的rsdate的TO_DAYS(rsdate)去计算他在哪个分区。
对于月报table_month去读取日报,入数据到月报的话,需要读取下一个月的分区数据。
为什么读取下个月的分区数据
比方说现在是2024年12月26号,根据TO_DAYS计算,它的值为739611。
2024年12月1号的TO_DAYS为739586对应p51。所以我们会以为12月1号-12月30号的12月份的数据都会存储在p51。
其实不是这样的,分区这里有LESS THAN,p51只会存储小于739586的数据也就是11月份的数据。
所以对于24年12月份的数据应该是存储在了p52分区中。
总结
所以我们在月报汇总的时候,读取日报的分区应该是获取下一个月的,并且当这个月是12月的时候,它的年份也应该+1.
if (nextMonth==1){DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");//进行转换LocalDate tempPartion = LocalDate.parse(fixDate, fmt);yearPartion = tempPartion.plusYears(1).getYear();}
相关的SQL语句
ALTER TABLE table_day DROP PARTITION p65;
ALTER TABLE table_day ADD PARTITION (PARTITION p65 VALUES LESS THAN (740316) ENGINE = MyISAM);