IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 记录最近优化统计sql学到的东西 -> 正文阅读

[开发工具]记录最近优化统计sql学到的东西

  1. sql优化要先拉取需要优化的语句放入数据库,用expalin查看运行计划,看是否走了索引,如果没有走,查看自己的语句分析没有走索引的原因,并进行语句修改。
  2. 可以用System.currentTimeMillis()来判断查询语句和for循环的使用时间。
  3. map的使用,把数据库查询出来的结果封装到map,在通过map.get(key)拿到value值,以此减少循环中和数据库交互的情况。


  • 由于在双重for循环使用了数据库交互,导致时间较长优化

优化方案:抽出与数据库交互的部分,用map来封装查询结果,取得时候从map中获取需要的值。

本次优化有两个难点:

  • 将普通查询结果封装到map
  • 查出来的结果做sum汇总

解决展示:1.将普通查询结果封装到map ,查出所有模板编码以及对应名称,数据库查询语句:

SELECT DISTINCT a.template_code templateCode,a.template_name templateName from message_template a 

数据库结果展示:

?

mapper.xml层封装(返回的是list<map<string,string>>),resultType用java.util.Map:

 <!--获取所有机构和机构名称 -->
    <select id="getdeptCodeAndName"
            resultType="java.util.Map">
            SELECT DISTINCT a.dept_id deptId,a.`name` deptName from sys_dept a
	</select>

mapper层封装:

 /**
     * 获取所有服务编码和服务名称
     * @return
     */
    List<Map<Integer,String>> getdeptCodeAndName();

实现类impl调用

        //获取全部模板和名称封装到map
        List<Map<String, String>> templateCodeAndNameList = countMapper.getTemplateCodeAndName();
        Map<String, String> getTemplateNameMap = new HashMap<>();
        for (Map<String, String> stringStringMap : templateCodeAndNameList) {
            getTemplateNameMap.put(stringStringMap.get("templateCode"),stringStringMap.get("templateName"));
        }

封装好的map使用

//上面是数据库交互,下面是直接从map中获取
//   sendStaticResp.setTemplateCode(countMapper.getTemplateName(templateCode));
      sendStaticResp.setTemplateCode(getTemplateNameMap.get(templateCode));

2.查出来的结果做sum汇总 :每个服务中每个机构的发送总数? ,数据库查询语句:

SELECT 
  sum(a.total_num) total ,a.dept_id deptId,a.template_code templateCode
FROM 
send_static_info a
GROUP BY a.dept_id,a.template_code;

查询结果:

?mapper.xml层封装(返回的是一个封装的对象,字段有templateCode,deptId,total):

<!--查出所有所有服务中所有机构对应的发送总数 -->
	<select id="getALLCount"
		resultType="com.sinosoft.liscloud.sms.api.vo.SendStaticSumResp">
        SELECT
         sum(a.total_num) total ,a.dept_id deptId,a.template_code templateCode
        FROM
        send_static_info a
        GROUP BY a.dept_id,a.template_code;
	</select>

mapper层封装:

/**
     * 查出所有所有服务中所有机构对应的发送总数
     * @return
     */
    List<SendStaticSumResp> getALLCount();

实现类impl调用:期间使用了System.currentTimeMillis()来判断查询语句和for循环的使用时间,

将查询结果封装到了两个map,getTotalMap封装了机构编号+服务编码,保证map中的key的唯一,外层循环为了查询不重复的服务编码,内层循环机构编码,在内层循环时通过传入的编码和机构编码,获取到查询结果中的total数,getSumTotalMap主要是做汇总使用,传入机构编码,为空直接从结果集获取total数,不为空从getTotalMap中通过机构编码查出来总数追加

  //查出所有所有服务中所有机构对应的发送总数
        List<SendStaticSumResp> sumList = new ArrayList<>();
        long l = System.currentTimeMillis();
        sumList = countMapper.getALLCount();
        long l2 = System.currentTimeMillis();
        System.out.println("查询语句-----------------------------------"+ (l2-l) );


        //将k和总数封装以及k和部门名称封装到不同的map中
        Map<String, Integer> getTotalMap = new HashMap<>();
        Map<String, Integer> getSumTotalMap = new HashMap<>();
        long currentTimeMillis = System.currentTimeMillis();
        for (SendStaticSumResp sendStaticSumResp : sumList) {
            if (sendStaticSumResp.getDeptId()==null){
                sendStaticSumResp.setDeptId("");
            }
            if (sendStaticSumResp.getTemplateCode() ==null){
                sendStaticSumResp.setTemplateCode("");
            }
            getTotalMap.put(sendStaticSumResp.getDeptId()+sendStaticSumResp.getTemplateCode(),sendStaticSumResp.getTotal());
            getSumTotalMap.put(sendStaticSumResp.getDeptId(),
                    getSumTotalMap.get(sendStaticSumResp.getDeptId())==null? sendStaticSumResp.getTotal()
                    : sendStaticSumResp.getTotal()+getSumTotalMap.get(sendStaticSumResp.getDeptId()) );
        }
        long currentTimeMillis2 = System.currentTimeMillis();
        System.out.println("查询for循环-----------------------------------"+(currentTimeMillis2-currentTimeMillis));

使用map

 if ("sum".equals(templateCode)){
                	templateCode = null;
                    sendStaticResp.setTemplateCode("汇总");
                    for(int i=0;i<deptIdList.size();i++) {
                    	String sumDeptId = deptIdList.get(i);
//                     	Integer sumTotal = countMapper.getCount(sumDeptId,templateCode);
                        Integer sumTotal= getSumTotalMap.get(sumDeptId);

                     	if(sumTotal ==null) {
                     		sumTotal=0;
                     	}






else {
                     for (int i=0;i<deptIdList.size();i++) {
                     	String deptId = deptIdList.get(i);
//                         String deptName = countMapper.getDeptName(deptId);
                         String deptName = getDeptNameMap.get(deptId);
                     	Integer total = 0;
                         Map<String, Integer> deptCount = new HashMap<>();

//                         total = countMapper.getCount(deptId, templateCode);
                          total =  getTotalMap.get(deptId+templateCode);

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:12:07  更:2022-03-21 21:16:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:39:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码