加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL之SQL优化实战记录

发布时间:2018-11-11 02:16:13 所属栏目:编程 来源:小祝特烦恼
导读:配景 本次SQL优化是针对javaweb中的表格查询做的。 部门收集架构图 营业简朴声名 N个机台将营业数据发送至处事器,处事器措施将数据入库至MySQL数据库。处事器中的javaweb措施将数据展示到网页上供用户查察。 原数据库计划 windows单机主从疏散 已分表分库
副问题[/!--empirenews.page--]

配景

本次SQL优化是针对javaweb中的表格查询做的。

部门收集架构图

MySQL之SQL优化拭魅战记录

营业简朴声名

N个机台将营业数据发送至处事器,处事器措施将数据入库至MySQL数据库。处事器中的javaweb措施将数据展示到网页上供用户查察。

原数据库计划

  • windows单机主从疏散
  • 已分表分库,按年分库,按天禀表
  • 每张表或许20w阁下的数据

原查询服从

3天数据查询70-80s

方针

3-5s

营业缺陷

无法行使sql分页,只能用java做分页。

题目排查

前台慢 or 靠山慢

  • 假如你设置了druid,可在druid页面中直接查察sql执行时刻和uri哀求时刻
  • 在靠山代码顶用System.currentTimeMillis计较时刻差。

结论 : 靠山慢,且查询sql慢

sql有什么题目

  • sql拼接过长,到达了3000行,有的乃至到8000行,大多都是union all的操纵,且有不须要的嵌套查询和查询了不须要的字段
  • 操作explain查察执行打算,where前提中除时刻外只有一个字段用到了索引

备注 : 因优化完了,之前的sql其实找不到了,这里只能YY了。

查询优化

去除不须要的字段

结果没那么明明

去除不须要的嵌套查询

结果没那么明明

解析sql

  • 将union all的操纵解析,譬喻(一个union all的sql也很长)
  1. select aa from bb_2018_10_01 left join ... on .. left join .. on .. where .. 
  2. union all 
  3. select aa from bb_2018_10_02 left join ... on .. left join .. on .. where .. 
  4. union all 
  5. select aa from bb_2018_10_03 left join ... on .. left join .. on .. where .. 
  6. union all 
  7. select aa from bb_2018_10_04 left join ... on .. left join .. on .. where .. 

将如上sql解析成多少个sql去执行,最终汇总数据,最后快了20s阁下。

  1. select aa from bb_2018_10_01 left join ... on .. left join .. on .. where .. 

将解析的sql异步执行

操作java异步编程的操纵,将解析的sql异步执行并最终汇总数据。这里用到了CountDownLatch和ExecutorService,示例代码如下:

  1. // 获取时刻段全部天数 
  2.        List<String> days = MyDateUtils.getDays(requestParams.getStartTime(), requestParams.getEndTime()); 
  3.        // 天数长度 
  4.        int length = days.size(); 
  5.        // 初始化归并荟萃,并指定巨细,防备数组越界 
  6.        List<你想要的数据范例> list = Lists.newArrayListWithCapacity(length); 
  7.        // 初始化线程池 
  8.        ExecutorService pool = Executors.newFixedThreadPool(length); 
  9.        // 初始化计数器 
  10.        CountDownLatch latch = new CountDownLatch(length); 
  11.        // 查询天天的时刻并归并 
  12.        for (String day : days) { 
  13.            Map<String, Object> param = Maps.newHashMap(); 
  14.            // param 组装查询前提 
  15.  
  16.            pool.submit(new Runnable() { 
  17.                @Override 
  18.                public void run() { 
  19.                    try { 
  20.                        // mybatis查询sql 
  21.                        // 将功效汇总 
  22.                        list.addAll(查询功效); 
  23.                    } catch (Exception e) { 
  24.                        logger.error("getTime非常", e); 
  25.                    } finally { 
  26.                        latch.countDown(); 
  27.                    } 
  28.                } 
  29.            }); 
  30.        } 
  31.  
  32.  
  33.        try { 
  34.            // 守候全部查询竣事 
  35.            latch.await(); 
  36.        } catch (InterruptedException e) { 
  37.            e.printStackTrace(); 
  38.        } 
  39.  
  40.        // list为汇总荟萃 
  41.        // 假若有须要,可以组装下你想要的营业数据,计较什么的,假如没有就没了 

功效又快了20-30s

优化MySQL设置

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读