核心:将现有表按年月拆分表,尽量做到每一张表的数据不是很大【千万以内】
步骤一:将现有表拷贝,根据原有数据从起始月开始创建表并重新分配数据。
insert into t_address_202311 select * from t_address WHERE YEAR(createtime) = 2023 AND MONTH(createtime) = 11
步骤二:修改程序,主要是增删改查,项目源码可能是JPA或是mybatis,微改造成如下:
1.实体增加一个字段
//扩展增加年月字段,不映射数据库字段
@javax.persistence.Transient
public String ym;
2.原有程序增加或修改如下:
//addressRepository.save(address); 注释掉,换成下面方法
@Autowired
private EntityManager entityManager;
=========================insert delete update===============================
String sql = "insert into t_address_"+TimeUtils.getYM()+"(user_id,name,phone,area,area_num,house_num,state) values (?, ?, ?, ?, ?, ?, ?)";
Query query = entityManager.createNativeQuery(sql);
query.setParameter(1,address.user_id);
query.setParameter(2,address.name);
query.setParameter(3,address.phone);
query.setParameter(4,address.area);
query.setParameter(5,address.area_num);
query.setParameter(6,address.house_num);
query.setParameter(7,address.state);
query.executeUpdate();
=============================分页列表=================================
String sql = "select * from t_address_"+ym;
Query query = entityManager.createNativeQuery(sql);
query.setFirstResult((page-1)*size);
query.setMaxResults(size);
String sql1 = "select count(1) from t_address_"+ym;
Query query1 = entityManager.createNativeQuery(sql1);
Object count = query1.getSingleResult();
Integer total = count != null ? Integer.parseInt(count.toString()) : 0;
Pageable pageable = PageRequest.of(page, size, Sort.Direction.DESC, "pid");
query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List resultList = query.getResultList();
Page<Model> data = new PageImpl<>(resultList,pageable,total);
3.原有列表查询功能增加一个筛选条件,年月筛选,查询不同表就OK。
步骤三:新建一些表作为以后储备,以后的数据会自动按照年月自动插入对应表,1年12张表,10年120张表,一个数据库足以运行很多年了。如果一个数据库达到顶峰,在根据数据特性拆分数据库。
欢迎伙伴们指出这么做有什么漏洞缺陷给我留言,我会尽快回复。