当前位置:   article > 正文

对于数据库进行分表,以及后续的查询(mysql)_mysql分表后怎样保证查询

mysql分表后怎样保证查询

       近期重构一个项目因为每天都有定时任务生成的数据,数据量越堆越多,老系统就是数据量上来后,系统卡死,后项目上让进行分表操作,,我这里根据业务数据量评估半年的数据量一个表,进行分表,具体操作如下,有什么不好的或错的欢迎大佬们指正。

 1.分表

我在网上搜索了很多决定使用MySQL的事件和存储过程进行定期分表。

1.1存储过程

  存储过程可参考 【精选】《Msql进阶一》-CSDN博客

  1. CREATE PROCEDURE create_number_table1()
  2. begin
  3. set @SQLStmt=concat("create table if not exists ",concat('table_',DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL 1 MONTH),'%Y%m')),"
  4. (
  5. `id` int(11) DEFAULT NULL,
  6. `name` varchar(50) DEFAULT NULL,
  7. `age` int(11) DEFAULT NULL
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定期分表';");
  9. PREPARE stmt FROM @SQLStmt;
  10. EXECUTE stmt;
  11. deallocate prepare stmt;
  12. end

1.2事件

使用mysql事件时需要开启事件调度器,可使用下面命令查看,开启

  1. -- 开启事件调度器
  2. SET GLOBAL event_scheduler = ON;
  3. -- 关闭事件调度器
  4. SET GLOBAL event_scheduler = OFF;
  5. -- 查看事件调度器状态
  6. SHOW VARIABLES LIKE 'event_scheduler';

事件具体信息可参考该链接 s​​MySQL事件(定时任务)_mysql 定时事件-CSDN博客

我的事件配置如下

 ​​​​​

 通过上面两步就实现了定期自动分表。

 2.查询

        查询时我这让前端做了限制,每次操作数据时涉及到分了表的,就必须传时间段,与业务人员沟通后并限制只能查当前时间往前半年的数据,这样最多同事查询两个表的数据,能相对快点。

因为每次都要根据时间段,用于判断操作那几个表,就简单写了个工具。

  1. /**
  2. * 根据时间判断需要查询的表(半年一分表)
  3. * @param sTime 开始时间
  4. * @param eTime 结束时间
  5. * @return table集合
  6. */
  7. public static List<String> getTableSuffix(Date sTime,Date eTime){
  8. List<String> list = new ArrayList<>();
  9. Calendar calendar = Calendar.getInstance();
  10. calendar.setTime(sTime);
  11. int y1 = calendar.get(Calendar.YEAR);
  12. int m1 = calendar.get(Calendar.MONTH)+1;
  13. if (m1>6){
  14. list.add(y1+"07");
  15. }else {
  16. list.add(y1+"01");
  17. }
  18. calendar.setTime(eTime);
  19. int y2 = calendar.get(Calendar.YEAR);
  20. int m2 = calendar.get(Calendar.MONTH)+1;
  21. if ((y2>y1)){
  22. list.add(y2+"01");
  23. }else if (y2==y1&&m1<=6&&m2>6){
  24. String table2= y2+"07";
  25. int index = list.indexOf(table2);
  26. if (index==-1){
  27. list.add(table2);
  28. }
  29. }
  30. return list;
  31. }

查询

  1. <foreach collection="tables" item="table" open="" separator="UNION" close="">
  2. select * from table1_${table} where
  3. 1=1
  4. <if test=" entity.code != null">
  5. and code = #{entity.code}
  6. </if>
  7. ...
  8. ...
  9. ...
  10. </foreach>
  11. order by start_time desc

 大概就是这样,写的不好,多多见谅。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/961071
推荐阅读
相关标签
  

闽ICP备14008679号