标签:思路 lan 排序 result water blog 取数据 stat 条件查询
之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是
分表查询
分表查询可以用union或者union all进行查询
union和union all都是将两个结果集合 合并在一起
select * from log_2019_05 where createTime > ‘2019-05-01 10:00:00‘
union all
select * from log_2019_06 where createTime < ‘2019-06-01 10:00:00‘
在我们的java程序里面,根据用户的传的查询开始时间和结束时间,就可以解析出要查询那些表,然后拼接成我们要查的sql就可以了,举例:可以把要查的表放进数组里面,然后在mybatis的查询方法的xml里面循环遍历拼接出sql
注:
union去重且排序
union all不去重不排序
性能上union all较快,比union少了排序,union是把数据合并之后还会进行排序,在排序中去掉重复的
这里的日志表没有重复的,本身就是有时间顺序,所以用union all
计算分表的总记录数
如果想要一进列表页面的分页地方要显示出总记录数,可以查询出所有的分表,然后union all拼接后用count(*),那问题又来了,如何查询出所有同样结构的分表
select table_name from INFORMATION_SCHEMA.TABLES where table_name like ‘log_%‘
最后我采用的方案是查询页面的查询条件默认查询当前月,第一次进来日志列表页就显示当前月的分页数据,所以就不需要查询所有的分表(如果查询的时候选了开始结束时间,则计算出开始结束时间之间的所有月份,union all连接相应的月份表查询)
注
information_schema.tables存储了数据表的元数据信息
information_schema数据库中的表都是只读的,不能进行更新、删除和插入等操作
按月的分表,每次要怎么创建
如何查询分表的某一条详细记录
在列表页面看到只是日志的概略,还有详细的日志需要点击进去详细页面查看,问题来了,以前只需要传id参数就可以了,现在在分表中,每个表都有可能有相同的id,所以只穿一个id肯定不行的,这个时候需要再多穿一个创建时间参数,在程序里面根据这个创建时间就知道是那张分表了,然后再根据id查询即可。
注:
如果分表的id采用的是全局唯一ID的方案,所有的分表id都是不一样的,也是可以直接用ID查询出来的
计算两个日期之间的所有月份
/**
*
* @param minDate 最小时间
* @param maxDate 最大时间
* @return 日期集合 格式为 年-月
* @throws Exception
*/
public static List<String> getMonthBetween(String minDate, String maxDate) throws Exception {
ArrayList<String> result = new ArrayList<String>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMM");//格式化为年月
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(sdf.parse(minDate));
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(sdf.parse(maxDate));
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
Calendar curr = min;
while (curr.before(max)) {
result.add(sdf2.format(curr.getTime()));
curr.add(Calendar.MONTH, 1);
}
return result;
}
public static void main(String[] args) throws Exception{
String minDate = "2018-09-02 00:15:01";
String maxDate = "2019-06-02 00:15:01";
List<String> list = DateUtils.getMonthBetween(minDate,maxDate);
for(String date :list){
System.out.println("时间:"+date);
}
}
运行main方法结果
原文链接:https://www.csdn.net/gather_20/MtTaUg3sODk3OC1ibG9n.html
mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表
标签:思路 lan 排序 result water blog 取数据 stat 条件查询
原文地址:https://www.cnblogs.com/ztf20/p/12304593.html