java解决mysql大数据联查问题

这篇具有很好参考价值的文章主要介绍了java解决mysql大数据联查问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java解决mysql大数据联查问题

近期有一个需求是联查两张表比对三个字段
一般用mysql就可以解决

SELECT
	* 
FROM
	tb_a a
	LEFT JOIN b ON a.test = b.test
	AND a.NAME = b.NAME 
	AND a.type = b.type

但是表a和表b的数据量都很不小,大概在10w左右,由于并不是以固定的id去关联,加了索引也没有效果,使用navicate根本就查不出来。
这时候想到了使用java去查,一开始采用的是双重for去比对,但是导致内存溢出根本差不出来。
后来想到了使用map利用这三个字段作为key去查,查询结果很快,大概几秒内就查出来了,由于这次是一个数据比对导出,不涉及到上线业务,所以就没有进行进一步的优化。
下面是核心代码

 public List<NoWidCompareDTO> getNoWidCompare() {
        List<NoWidCompareDTO> result = new ArrayList<>();
       
        // 为了方便直接查的,可以优化查询
        List<EEaResourceDataWidNo> noWidList = noWidMapper.selectList(null);
        List<CollectionAllLevel> otherList = allLevelMapper.selectList(null);
        log.info("开始比对:{}", DateUtil.now());

        // 构建一个以三个条件为键,CollectionAllLevel对象为值的Map,方便后续查找
        Map<String, CollectionAllLevel> otherMap = new HashMap<>();
        for (CollectionAllLevel allLevelDTO : otherList) {
            String key = getKey(allLevelDTO);
            otherMap.put(key, allLevelDTO);
        }

        for (EEaResourceDataWidNo noWidDTO : noWidList) {
            String key = getKey(noWidDTO);
            CollectionAllLevel allLevelDTO = otherMap.get(key);
            // 构建NoWidCompareDTO,并进行属性复制
            NoWidCompareDTO dto = BeanUtil.toBean(noWidDTO, NoWidCompareDTO.class);
            if (allLevelDTO != null) {
                // 如果比对成功进行复制
                BeanUtil.copyProperties(allLevelDTO, dto);
            }
            // 都要添加进去
            result.add(dto);
        }

        log.info("比对结束:{}", DateUtil.now());
        return result;
    }
    
   /**
     * 等级,馆藏名称,资源名称统一设置为key,当然也可以在查询的时候直接设置
     */
    private String getKey(EEaResourceDataWidNo noWidDTO) {
        return noWidDTO.getLevel() + "_" + noWidDTO.getCollectionUnits() + "_" + noWidDTO.getResourceName();
    }

    /**
     * 等级,馆藏名称,资源名称统一设置为key,当然也可以在查询的时候直接设置
     */
    private String getKey(CollectionAllLevel allLevelDTO) {
        return allLevelDTO.getOtherLevel() + "_" + allLevelDTO.getMuseumCollectionName() + "_" + allLevelDTO.getCollectionName();
    }

这效果和以a表作为主表进行左连接查询一样。
总之上面的代码仅作为简单的操作,还有一些逻辑都没校验,也可以进行优化,重点就是使用map的key,value进行操作比对文章来源地址https://www.toymoban.com/news/detail-656166.html

到了这里,关于java解决mysql大数据联查问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决MySQL数据库拒绝远程计算机连接问题

    错误信息:Host is not allowed to connect to this mysql server 以前MySQL数据库部署在云服务器上,程序服务端也部署在云服务器上,连接服务器从没出现过问题。最近有一次需要做一个完全局域网的环境部署,我把数据库和程序服务端部署在里两台不同的电脑上,访问数据库的时候出现

    2024年02月09日
    浏览(45)
  • Mysql与SeaweedFS数据不同步问题产生原因及解决办法

    在数据库和文件存储系统之间保持一致性是数据管理中的一个关键问题。这篇文章将专注于Mysql和SeaweedFS(一种快速、简单和高效的分布式存储系统)之间数据不同步的问题,探讨可能的原因并提出相应的解决策略。 Mysql是最流行的关系型数据库管理系统之一,被广泛应用于

    2024年02月06日
    浏览(34)
  • Mysql Php 推送获取随机数据解决分页重复问题

    或许你已经看过很多博主写的文章,要不就是抄袭,要不就是给你一个下面的语句,随机是随机了,但是多来两页,你会发现前面出现的数据在第三页甚至第二页就出现了 这是因为rand()机制的问题,他每次都会打乱数据给你,然后你去取的时候0-10,11-20都有可能是同一个数据

    2024年02月06日
    浏览(47)
  • 【问题解决】mysql 数据库字符串分割之后多行输出方法

    项目需要从一张表查询出来数据插入到另一张表,其中有一个字段是用逗号分隔的字符串,需要多行输入到另一张表,那么这个如何实现呢 下面先粘贴下sql语句: 参数解释 1.SUBSTRING_INDEX(str, delimiter, count)     参数解释     str :必填。STRING类型。待截取的字符串     separat

    2024年02月14日
    浏览(48)
  • IDEA链接MySQL数据库遇到的部分问题及解决方案

    合理怀疑MySQL是不是克我,上次配环境配到崩溃就是因为MySQL安装失败,这次是因为链接不上IDEA 闲话少叙,直接看代码、报错信息以及解决方式: 代码: 报错信息:Tue Dec 12 01:47:57 CST 2023 WARN: Establishing SSL connection without server\\\'s identity verification is not recommended. According to MySQL 5

    2024年02月05日
    浏览(57)
  • QT连接MySql数据库失败,编译驱动问题,最详细解决办法

    各位读者你们好🔥 此篇是本专栏的第一篇,本专栏专门收录在学习过程中遇到的环境配置、软件问题等开发环境方面的问题。🚀🚀🚀 刚刚转阴就迫不及待的赶紧写一篇博客来解决一直落下的一个问题: 关于QT和MySql数据库的连接问题😷(在本人经过整整三天的无限踩坑之

    2024年02月05日
    浏览(56)
  • Django后端开发——mysql数据库连接遇到的问题及解决

    stackflow帖子:https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost 报错: 数据库拒绝root用户的连接 settings.py中关于数据库的配置: 可以看到root用户的密码为123456 但是在mysql数据库里面查看用户信息,root的密码为空 这样的不匹配导致连接失败 之前尝试

    2024年02月20日
    浏览(74)
  • mysql8.0无法创建数据库 解决root无法授权问题

    mysql的赋权操作:GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘你的密码‘ WITH GRANT OPTION; mysql赋权操作: use mysql; GRANT ALL PRIVILEGES ON *.* TO \\\'root\\\'@\\\'%\\\' IDENTIFIED BY \\\'你的密码\\\' WITH GRANT OPTION; flush privileges; GRANT:赋权命令 ALL PRIVILEGES:当前用户的所有权限 ON:介词 *.*:当前用户

    2024年02月12日
    浏览(42)
  • 外部navicat无法连接mysql数据库的问题原因及解决方案

    问题起因是这样:在linux操作中的docker中部署了一个数据库,数据库启动之后,端口也映射了(创建容器时用 -p 30036:3306进行的映射),但是在外不想使用navicat连接时,怎么都连不上,本人遇到的问题如下 一、端口虽然映射了,但是服务器上的30036端口并未对外开放,因此要先开

    2024年02月07日
    浏览(56)
  • 解决MySQL中分页查询时多页有重复数据,实际只有一条数据的问题

    有一个离奇的BUG,在查询时,第一页跟第二页有一个共同的数据。有的数据却不显示。 后来发现是在SQL排序时没用主键排序。 解决:使用主键排序 以下是我准备的举例,可以自己试试。 分页查询公式:分页查询–他的公式为(伪代码): [NOT] LIMIT (curPage-1)*pageSize,pageSize 执行

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包