2018年3月16日

大型仪器设备分类查出后,需要展示个分类下总共有多少台设备。因为分类总共分三层,加起来数据700+。以后该系统上线设备可能达到2000+,这样统计每个分类下的设备可能会拖垮服务器。

下面给出项目图片

今天先把问题抛出来。 现在有两种方法解决:

1.根据每个分类查询所在分类下的所有设备仪器,这种方法不可行,分类就大概700+,每个都要查库非得崩了。

2.应该把所有设备都查询出来,然后把设备归到某些分类下。但,怎么把所有设备分到700+分类下呢?

2018年3月19日,早晨来了大概按着第二种方法写了代码,首先查出所有设备,每个设备一定是对应到第三级节点上面的,把所有设备加到第三级节点中,然后再通过第三级节点加到第二级节点,最后加到根节点。

第一步骤  首先查出所有的一级、二级、三级节点,分别放入到对应的map中,为了后期查询方便。

     //取出根节点
categoryRootList = cmsInstrumentDaoImpl.getInstrumentClassRootData();
categoryRootSeedList = cmsInstrumentDaoImpl.getInstrumentClassRootSeedData();
categoryRootSeedSeedList = cmsInstrumentDaoImpl.getInstrumentClassRootSeedSeedData();
HashMap<String, CategoryBean> RootMap = new HashMap<String, CategoryBean>();
HashMap<String, CategoryBean> RootSeedMap = new HashMap<String, CategoryBean>();
HashMap<String, CategoryBean> RootSeedSeedMap = new HashMap<String, CategoryBean>();
//把所有根节点都放入map中
for(CategoryBean categoryBeanRoot : categoryRootList){
categoryBeanRoot.setList_i(new ArrayList<CategoryBean>());
RootMap.put(categoryBeanRoot.getParents(), categoryBeanRoot);
}
//把所有二级节点都放入map中
for(CategoryBean categoryBean_i : categoryRootSeedList){
categoryBean_i.setList_ii(new ArrayList<CategoryBean>());
RootSeedMap.put(categoryBean_i.getParents(), categoryBean_i);
}
//查出所有的仪器设备,分别查出每个仪器的分类的parents,然后加到每个分类下。
for(CategoryBean categoryBean_ii : categoryRootSeedSeedList){
categoryBean_ii.setList_ii(new ArrayList<CategoryBean>());
RootSeedSeedMap.put(categoryBean_ii.getParents(), categoryBean_ii);
}

第二步骤   把查询到的所有设备放入第三级节点

List<EquipmentInfoBean> eqList = new ArrayList<EquipmentInfoBean>();
eqList = cmsInstrumentDaoImpl.getInstrumentSuosfl();
String suosfl_parents = "";
CategoryBean newcategoryBean = new CategoryBean();
for(EquipmentInfoBean eq : eqList){
suosfl_parents = eq.getSuosfl_parents();
//根据suosfl_parents 查询到的数据不为空则认为该设备属于此分类
if(RootSeedSeedMap.get(suosfl_parents) != null){
newcategoryBean = RootSeedSeedMap.get(suosfl_parents);
newcategoryBean.setRecver(newcategoryBean.getRecver()+1);
RootSeedSeedMap.put(suosfl_parents, newcategoryBean);
}
}

第三步骤 把三级节点获取的数据放到二级节点,把二级节点的数据放到一级节点

    String parentsRootSeed = "";
CategoryBean categoryBean_i = new CategoryBean();
for(Entry<String, CategoryBean> entry : RootSeedSeedMap.entrySet()){
parentsRootSeed = entry.getValue().getParents().substring(0, categoryBean_ii_length-34);
//在map中找到对应的一级节点,将二级节点放入一级节点中
categoryBean_i = RootSeedMap.get(parentsRootSeed);
categoryBean_i.setRecver(categoryBean_i.getRecver() + entry.getValue().getRecver()); // 计算数字
categoryBean_i.getList_ii().add(entry.getValue());
}
// 拿出所有根节点进行遍历查出 查出每个根节点对应的二级节点
//TODO 二级节点的parents = 一级节点的parents + 00 + 二级节点的objectid或者resid
String parentsRoot = "";
CategoryBean categoryBean = new CategoryBean();
for(Entry<String, CategoryBean> entry : RootSeedMap.entrySet()){
parentsRoot = entry.getValue().getParents().substring(0, categoryBean_i_length-34);
//在map中找到对应的一级节点,将二级节点放入一级节点中
categoryBean = RootMap.get(parentsRoot);
categoryBean.setRecver(categoryBean.getRecver()+entry.getValue().getRecver()); //同上
categoryBean.getList_i().add(entry.getValue());
}

虽然是能查询出来,大概费事300ms 但是因为设备数量只有两个,我想数据量大时仍有待优化,后期如果有好想法再写出来

List<Object> 查询解析优化的更多相关文章

  1. Solr查询配置及优化【eDisMax查询解析器】

    一.简介 Lucene查询解析器语法支持创建任意复杂的布尔查询,但还有一些缺点,它不是用户查询处理的理想解决方案.这里面最大的问题是Lucene查询解析器的语法要求严格,一旦破坏就会抛出异常.指望用户 ...

  2. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  3. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  4. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  5. mysql笔记03 查询性能优化

    查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减 ...

  6. SQL大量数据查询的优化 及 非用like不可时的处理方案

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. sql大数据量查询的优化技巧

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  8. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  9. Mysql常用30种SQL查询语句优化方法

    出处:http://www.antscode.com/article/12deee70111da0c4.html 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...

随机推荐

  1. MySQL更改默认的root账户密码

    编辑mysql的配置文件:my.ini(在MySql安装目录下). 打开配置文件,在文件最后一行添加:skip-grant-tables,然后保存退出 意思为就是在启mysql时不启动grant-ta ...

  2. Spring中解决循环依赖报错的问题

    什么是循环依赖 当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖: ClassA -> ClassB -> ClassA 原创声明 本 ...

  3. SpringMVC笔记三

    课程安排: 第一天:springmvc的基础知识 什么是springmvc? springmvc框架原理(掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 springmvc入门程序 目的: ...

  4. day5-1继承

    继承: Constructor属性和prototype属性的关系: 创建了自定义的构造函数之后,其原型对象默认会取得constructor属性:当调用构造函数创建一个新实例后,该实例的内部将包含一个指 ...

  5. 模拟服务容器Ioc

    服务容器是一个用于管理类依赖和执行依赖注入的强大工具. 一个类要被容器所能够提取,必须要先注册至这个容器.既然称这个容器叫做服务容器,那么我们需要某个服务,就得先注册.绑定这个服务到容器,那么提供服务 ...

  6. 第1节 Scala基础语法:3、环境;4、插件

    1.    Scala编译器安装 1.1.   安装JDK 因为Scala是运行在JVM平台上的,所以安装Scala之前要安装JDK. 1.2.   安装Scala 1.2.1.    Windows ...

  7. 如何启动mac版docker自带的k8s

    最近准备好好学习下k8s,为了图方便,直接使用docker集成的k8s,但是网上找了一些教程但都没能一次性成功,只好自己从头跑一遍,顺手写个教程可以方便有类似需求的同学参考. 话不多说,直接上步骤. ...

  8. Hexo引入Mermaid流程图和MathJax数学公式

    近来用Markdown写文章,越来越不喜欢插入图片了,一切能用语法解决的问题坚决不放图,原因有二: 如果把流程图和数学公式都以图片方式放到文章内,当部署到Github上后,访问博客时图片加载实在太慢, ...

  9. 一步一步配置docker(tomcat+jenkins+phpmyadmin+nginx)

    经过半个月的docker学习实践,今天对自己的学习成果做个总结. 貌似官方推荐的是docker compose使用DockerFile 来配置,但目前还没学习使用docker compose,先学习通 ...

  10. jmeter实现文件下载

    通过浏览器下载文件时,会提示选择保存路径,但是利用测试工具jmeter请求时,在页面看到请求次数是增加了,而本地没有具体下载下来的文件. 需要在具体的文件下载请求下面,添加后置处理器-bean she ...