iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java查询数据库百万条数据,优化之:多线程+数据库
  • 549
分享到

java查询数据库百万条数据,优化之:多线程+数据库

java数据库servlet 2023-08-16 22:08:02 549人浏览 安东尼
摘要

java百万查询语句优化 业务需求 今天去面试时hr问了个关于大量数据查询的问题。 面试官:“我们公司是做数据分析的,每次需要从数据库中查询100万条数据进行分析,不能用分页,请问怎么优化sql或者java代码呢??” 如果用普通查询

java百万查询语句优化

业务需求

今天去面试时hr问了个关于大量数据查询的问题。

面试官:“我们公司是做数据分析的,每次需要从数据库中查询100万条数据进行分析,不能用分页,请问怎么优化sql或者java代码呢??”

如果用普通查询需要5分多分钟才查询完毕,所以我们用索引多线程来实现。

那我们就开始吧!GO!!GO!!

数据库设计

编写数据库字段

然后要生成100万条数据

image-20230606110030790

在数据库添加索引

image-20230606112107605

索引这个方面我还是不太了解,大家懂的可以优化索引

代码实现

java编写

controller类编写

package com.neu.controller; import com.neu.mapper.UserMapper;import com.neu.pojo.User;import org.springframework.stereotype.Controller;import org.springframework.WEB.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import javax.annotation.Resource;import java.util.*;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors; @Controllerpublic class ExecutorUtils {   @Resource   private UserMapper userMapper;    // 一个线程最大处理数据量   private static final int THREAD_COUNT_SIZE = 5000;   @RequestMapping("Executor")   public List executeThreadPool() {      //计算表总数      Integer integer = userMapper.UserSum();      //记录开始时间      long start = System.currentTimeMillis();      //new个和表总数一样长的ArrayList      List threadList=new ArrayList<>(integer);      // 线程数,以5000条数据为一个线程,总数据大小除以5000,再加1      int round = integer / THREAD_COUNT_SIZE + 1;      //new一个临时储存List的Map,以线程名为k,用做list排序      Map temporaryMap = new HashMap<>(round);      // 程序计数器      final CountDownLatch count = new CountDownLatch(round);      // 创建线程      ExecutorService executor = Executors.newFixedThreadPool(round);      // 分配数据      for (int i = 0; i < round; i++) {         //该线程的查询开始值         int startLen = i * THREAD_COUNT_SIZE;         int k = i + 1;         executor.execute(new Runnable() {            @Override            public void run() {               ArrayList users = userMapper.subList(startLen);               //把查出来的List放进临时Map               temporaryMap.put(k,users);               System.out.println("正在处理线程【" + k + "】的数据,数据大小为:" + users.size());               // 计数器 -1(唤醒阻塞线程)               count.countDown();            }         });      }      try {         // 阻塞线程(主线程等待所有子线程 一起执行业务)         count.await();         //结束时间         long end = System.currentTimeMillis();         System.out.println("100万数据查询耗时:" + (end - start) + "ms");         //通过循环遍历临时map,把map的值有序的放进List里         temporaryMap.keySet().forEach(k->{            threadList.addAll(temporaryMap.get(k));         });      } catch (Exception e) {         e.printStackTrace();      } finally {         //清除临时map,释放内存         temporaryMap.clear();         // 终止线程池         // 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。若已经关闭,则调用没有其他作用。         executor.shutdown();      }      //输出list的长度      System.out.println("list长度为:"+threadList.size());      return threadList;   }}

编写Mapper

package com.neu.mapper;import java.util.ArrayList;import java.util.List;import org.apache.ibatis.annotations.*;import com.neu.pojo.User;@Mapperpublic interface UserMapper {        @Select("SELECT count(*) as sum FROM sysuser")Integer UserSum();     @Select("select * from sysuser LIMIT #{startLen},5000")ArrayList subList(@Param("startLen") int startLen);}

编写完成后我们测试一波–>

测试结果20秒内,比之前快了好多

模糊查询

模糊查询呢?

咱测试一下:

修改Mapper

package com.neu.mapper;import java.util.ArrayList;import java.util.List;import org.apache.ibatis.annotations.*;import com.neu.pojo.User;@Mapperpublic interface UserMapper {         @Select("SELECT count(*) as sum FROM sysuser where id like concat('%',0,'%')")Integer UserSum();     @Select("select * from sysuser  where id like concat('%',0,'%') LIMIT #{startLen},5000")ArrayList subList(@Param("startLen") int startLen);}

修改完成后我们再测试一波–>

image-20230606110806810

耗时5秒左右,可以满足业务需求

结束

目前基本的查询已经写完

看到这个文章的还可以对以下方面进行优化:

  1. 索引进行优化。
  2. 每个线程查询多少条数据最为合适??
  3. 如果配置有线程池可以使用:总条数/线程数==每个线程需要查询多少条数据。
  4. 进行代码优化,优化一些耗时的代码。

来源地址:https://blog.csdn.net/m0_57647880/article/details/131064291

--结束END--

本文标题: java查询数据库百万条数据,优化之:多线程+数据库

本文链接: https://www.lsjlt.com/news/372173.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java查询数据库百万条数据,优化之:多线程+数据库
    java百万查询语句优化 业务需求 今天去面试时hr问了个关于大量数据查询的问题。 面试官:“我们公司是做数据分析的,每次需要从数据库中查询100万条数据进行分析,不能用分页,请问怎么优化sql或者java代码呢??” 如果用普通查询...
    99+
    2023-08-16
    java 数据库 servlet
  • oracle百万数据查询怎么优化
    使用合适的索引:在查询大量数据时,使用合适的索引可以大大提高查询性能。确保数据表上的列经常被查询的列上创建索引,以加速查询速度。 ...
    99+
    2024-04-09
    oracle
  • MySQL百万级数据分页查询优化方案
    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询。对于数据库分页查询,也有很多种方法和优化的点。下面简单说一下我知道的一些方法。 ...
    99+
    2024-04-02
  • mysql查询优化之100万条数据的一张表优化方案
    1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫...
    99+
    2024-04-02
  • MySQL数据库10秒内插入百万条数据的实现
    首先我们思考一个问题: 要插入如此庞大的数据到数据库,正常情况一定会频繁地进行访问,什么样的机器设备都吃不消。那么如何避免频繁访问数据库,能否做到一次访问,再执行呢? Java其实已...
    99+
    2024-04-02
  • mysql数据库表的多条件查询
    mysql数据库表的多条件查询 一、select语句基本查询 SELECT 字段1,字段2....FROM 表名[WHERE 条件] [LIMIT N][ OFFSET M] select可以返回多条数据也可以返回一条数据...
    99+
    2023-08-22
    数据库 mysql sql
  • 数据库之MySQL查询去重数据
    最近遇到了一个问题,当时我的第一反应是导出来,用wps的Excel表格的删除重复项的功能,简单粗暴又直接,但是没有考虑到数据量太大的情况,会导致Excel打开缓慢。这个时候就考虑有没有更方便快捷的方法,网上也查询了很多方法,但是实践出真知,...
    99+
    2023-09-03
    数据库
  • 数据库查询优化之子查询优化的示例分析
    这篇文章将为大家详细讲解有关数据库查询优化之子查询优化的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 案例取所有不为掌门人的员工,按年龄分组!selec&#...
    99+
    2024-04-02
  • 【Java】Mybatis查询数据库
    文章目录 MyBatis查询数据库1. MyBatis 是什么?2. 为什么要学习MyBatis?3. 怎么学MyBatis?4. 第一个MyBatis查询4.1 创建数据库和表4.2 添加M...
    99+
    2023-09-06
    java mybatis spring
  • 查询数据(数据库)——简单查询
    目录 1.最简单的查询 (1)查询指定列 (2)查询所有列 (3)查询计算列 (4)为列起别名 (5)使用DISTINCT关键字消除重复元组 2.查询满足条件的元组 (1) 比较大小 (2) 确定范围 (3) 确定集合 (4) 字符匹配 (...
    99+
    2023-10-11
    数据库 sql mysql
  • MySQL数据库查询之多表查询总结
    目录多表关系表与表之间的联系:一对多(多对一)多对多一对一多表查询多表查询的分类1.连接查询:2.子查询内连接外连接自连接联合查询子查询标量子查询列子查询行子查询表子查询多表查询案例...
    99+
    2022-11-13
    mysql多表查询语句 mysql多表连接查询方式 mysql多表查询面试题
  • 一条SQL语句查询多个数据库
    需求:一条SQL语句从多个数据库查询出相关联的结果,输出到客户端 调查:spring框架可以配置多数据源;sql也可以将多个数据库附加到一个主数据库下 解决办法:用ATTACH DATABASE语句将多个库...
    99+
    2024-04-02
  • MySQL百万级数据大分页查询优化的实现
    目录一、MySQL分页起点越大查询速度越慢二、 limit大分页问题的性能优化方法(1)利用表的覆盖索引来加速分页查询(2)用上次分页的最大id优化三、MySQL百万数据快速生成3....
    99+
    2024-04-02
  • 怎么在mysql中优化百万级数据表的查询
    怎么在mysql中优化百万级数据表的查询?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.两种查询引擎查询速度(myIsam 引擎 )InnoDB 中不保存表的...
    99+
    2023-06-15
  • 数据库查询优化之巅:挑战极限,释放数据洪流
    1. 索引策略 索引是加速数据检索的关键。创建适当的索引可以显著减少查询执行时间。 选择正确的索引列:确定经常用于查询的列,并在这些列上创建索引。 使用组合索引:组合索引将多个列合并到一个索引中,从而提高对复合查询的性能。 避免冗余索引...
    99+
    2024-04-02
  • 【MySQL数据库】- 多表查询
    🍁博客主页:👉@不会压弯的小飞侠 ✨欢迎关注:👉点赞👍收藏⭐留言✒ ✨系列专栏:👉MySQL数据库专栏 ✨欢迎加入社区: 👉不会压弯的小...
    99+
    2023-08-17
    数据库 mysql sql
  • Server数据库中怎么优化查询
    Server数据库中怎么优化查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。  Server数据库查询优化方法有哪些  1.尽量不要使用...
    99+
    2024-04-02
  • Laravel8中如何优化数据库查询
    这篇文章主要介绍了Laravel8中如何优化数据库查询的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Laravel8中如何优化数据库查询文章都会有所收获,下面我们一起来看看吧。    &nb...
    99+
    2023-06-29
  • 千万级数据的mysql数据库与优化方法
    本篇内容主要讲解“千万级数据的mysql数据库与优化方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“千万级数据的mysql数据库与优化方法”吧!1.对查询进行...
    99+
    2024-04-02
  • java小知识之查询数据库数据的元信息
    目录简介 使用ResultSet 使用ResultSetMetaData 总结 简介 java中数据库的操作相信大家都不陌生,JDK提供了java.sql包来规范对数据库的各种操作...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作