一,并发执行sql问题,多库同时并发,提高效率。
如果是执行单条sql,在当前线程执行;
如果是执行多条sql在不同的库中或者同一个库中多个表里面,当前线程执行第一条sql,使用线程池执行其他的sql。
比如查询某个商户下面所有的账户,账户可能根据id规则分布在不同的数据库中,需要执行分片个数条sql,需要并发执行查询。
二,结果归并汇总,多库查询后,需要对结果进行加工,才能得出正确的数据。
1,无排序,无聚合函数,无分页的多库查询结果合并
这种是最简单的一种情况,多条sql执行后,得到多个resultSet,把多个resultSet简单合并,
遍历每个resultSet执行resultSet.next()获取数据记录即可,每次获取1条记录。
比如查询某个商户下面所有的账户,账户可能根据id规则分布在不同的数据库中,需要执行分片个数条sql,结果合并就是这种情况。
2,有排序,无聚合函数,无分页的多库查询结果合并
多条sql执行后,得到多个resultSet,把多个resultSet放入一个排序队列中,按每个resultSet的第一条记录排序,每次出队第一条记录,
相当于每次取多个resultSet中排序后记录最小或者最大的那条。
3,有排序,有聚合函数,并且排序和聚合字段相同,无分页的结果合并
a,按聚合(或排序)字段排序:多条sql执行后,得到多个resultSet,把多个resultSet放入一个排序队列中,按每个resultSet的第一条记录排序,每次出队第一条记录,
相当于每次取多个resultSet中排序后记录最小或者最大的那条。
b,按顺序取出记录后,把聚合字段值相同的记录里面的聚合字段值进行统计,sum,count,max,min四种。
如果聚合字段值变了,再次重新开始统计。每次统计后形成一条真正的记录对外输出。
c,对于avg函数,对外输出记录的时候,计算得出avg = sum/count
4,有分页的情况
对应上面几种情况的结果,按分页偏移量信息,忽略偏移量前面的记录,从偏移量位置开始真正输出。
5,有排序,有聚合函数,并且排序和聚合字段不相同,无分页的结果合并
这个场景支持在内存中聚合和排序,注意大数据量导致内存溢出。
a,遍历每一个查询的结果集里面的每一条记录,按聚合字段进行聚合计算。
b,聚合计算结果再按排序字段进行排序。