根据业务实现逻辑优化查询 - 案例(二)

(1)需求描述(因公司要求绝对保密,不能展示原SQL及相关表,仅描述实现结果):有A、B、C三个表(来自数据组提供的视图,我们只有查询权限,无增、删、改、创建权限),分别代表不同时间不同类型的数据,表结构类似:统计年月(yearMonth)、统计值(value)。要求将三表中最近5年的结果以echarts柱状图方式进行展示。

(2)需求分析:

     1、最近5年,是指数据库中最大年份为准,向前推5年;

     2、echarts柱状图只有5年的数据;

     3、三个表以最大年份开始推算,没有数据的年份统计值补0。

(3)实现步骤:1、三个表分别取最大年份,用union all 合成一个SQL,得到三个值;

                           2、三个年份比较取最大。

                           3、使用java代码向前推5年,得到开始查询的年份(实际是年月)。

                           4、分别从三个表中查询,符合上一步时间的数据,同样union  all,合成一个SQL。

                           5、java代码组合5年的数据为Map<List>集合,返回数据。

                           6、ajax获取数据,绑定到echarts。

  (4)实现结果:图表加载数据时间大约4秒。但需求有明确要求2秒内加载数据

   (5)分析:将三个表分别单独执行查询,其中一个查询稍慢,1.6秒,另外2个0.1秒内。

   (6)优化方法:1、建索引:视图没法建索引,只能再源表中建索引,但没有权限,暂时放弃,没有其他方法时再与数据组进行沟通处理。

                               2、重新分析实现方式:2个SQL,用了4个union all,查了3个表。实际上等于走了6次查询。如果可以并发查询或者减少查询次数,可以大大缩短查询时间。首先,多线程可以并发查询,但此处不适用,因为第二次查询需要第一次的查询结果。然后,是否可以减少查询次数呢??当然可以:

实现步骤:1、每个表中按年份分组,按年份倒序,取5年的数据(year、value、type(自定义区分表));用union all 拼接三个SQL。SQL示例:

       (SELECT sum(value) AS value,'typeA' as type, LEFT(FOUND_TIME,4) as ayear
        FROM A
        group by ayear
        order by ayear desc
        limit 5)
      UNION ALL
       ( SELECT sum(value) AS value,'typeB' as type, LEFT(FOUND_TIME,4) as ayear
        FROM  B
        group by ayear
        order by ayear desc
        limit 5)
      UNION ALL
        (SELECT  sum(value) AS value, 'typeC' as type, LEFT(FOUND_TIME,4) as ayear
        FROM C
        group by ayear
        order by ayear desc
        limit 5)
    
    

结果示例:速度1.6秒。

2、处理结构日期,求最大年份推5年,组成容量为5 的List集合。

3、遍历年份List,处理查询的结果集,封装到三个List集合中。

4、封装结果集到 Map<String,List>集合以返回。

 

最后总结:SQL的优化之前,先想想自己的实现方式是最合理的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值