广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中使用流式查询避免数据OOM
  • 257
分享到

MySQL中使用流式查询避免数据OOM

MySQL流式查询 2022-05-15 05:05:20 257人浏览 薄情痞子
摘要

一、前言 程序访问Mysql数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。 其实在mysql数据库中提供了流式查询,允许把符合条件的数据分批一部分一

一、前言

程序访问Mysql数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。

其实在mysql数据库中提供了流式查询,允许把符合条件的数据分批一部分一部分地加载到内存中,可以有效避免OOM;本文主要介绍如何使用流式查询并对比普通查询进行性能测试

二、JDBC实现流式查询

使用JDBC的PreparedStatement/StatementsetFetchSize方法设置为Integer.MIN_VALUE或者使用方法Statement.enableStreamingResults()可以实现流式查询,在执行ResultSet.next()方法时,会通过数据库连接一条一条的返回,这样也不会大量占用客户端的内存。


public int execute(String sql, boolean isStreaMQuery) throws SQLException {
 Connection conn = null;
 PreparedStatement stmt = null;
 ResultSet rs = null;
 int count = 0;
 try {
  //获取数据库连接
  conn = getConnection();
  if (isStreamQuery) {
   //设置流式查询参数
   stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
   stmt.setFetchSize(Integer.MIN_VALUE);
  } else {
   //普通查询
   stmt = conn.prepareStatement(sql);
  }

  //执行查询获取结果
  rs = stmt.executeQuery();
  //遍历结果
  while(rs.next()){
   System.out.println(rs.getString(1));
   count++;
  }
 } catch (SQLException e) {
  e.printStackTrace();
 } finally {
  close(stmt, rs, conn);
 }
 return count;
}

「PS」:上面的例子中通过参数isStreamQuery来切换「流式查询」「普通查询」,用于下面做测试对比。

三、性能测试

创建了一张测试表my_test进行测试,总数据量为27w条,分别使用以下4个测试用例进行测试:

  • 大数据量普通查询(27w条)
  • 大数据量流式查询(27w条)
  • 小数据量普通查询(10条)
  • 小数据量流式查询(10条)

3.1. 测试大数据量普通查询


@Test
public void testCommonBigData() throws SQLException {
 String sql = "select * from my_test";
 testExecute(sql, false);
}

1.1. 查询耗时

27w 数据量用时 38 秒

1.2. 内存占用情况

使用将近 1G 内存

3.2. 测试大数据量流式查询


@Test
public void testStreamBigData() throws SQLException {
 String sql = "select * from my_test";
 testExecute(sql, true);
}

2.1. 查询耗时

27w 数据量用时 37 秒

2.2. 内存占用情况

由于是分批获取,所以内存在30-270m波动

3.3. 测试小数据量普通查询


@Test
public void testCommonSmallData() throws SQLException {
 String sql = "select * from my_test limit 100000, 10";
 testExecute(sql, false);
}

3.1. 查询耗时

10 条数据量用时 1 秒

3.4. 测试小数据量流式查询


@Test
public void testStreamSmallData() throws SQLException {
 String sql = "select * from my_test limit 100000, 10";
 testExecute(sql, true);
}

1. 查询耗时

10 条数据量用时 1 秒

四、总结

MySQL 流式查询对于内存占用方面的优化还是比较明显的,但是对于查询速度的影响较小,主要用于解决大数据量查询时的内存占用多的场景。

「DEMO地址」:https://GitHub.com/zlt2000/mysql-stream-query

到此这篇关于MySQL中使用流式查询避免数据OOM的文章就介绍到这了,更多相关MySQL 流式查询内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中使用流式查询避免数据OOM

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL中使用流式查询避免数据OOM
    一、前言 程序访问MySQL数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。 其实在MySQL数据库中提供了流式查询,允许把符合条件的数据分批一部分一...
    99+
    2022-05-15
    MySQL 流式查询
  • Mybatis流式游标查询-大数据DB查询OOM查询问题
    问题场景 Mysql数据处理类型分以下三种 com.mysql.cj.protocol.a.result.ResultsetRowsStatic:普通查询,将结果集一次性全部拉取到内存 com.mysql.cj.protocol.a....
    99+
    2023-09-01
    mysql 性能优化 Powered by 金山文档
  • MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
    MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现 MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现普通查询流式查询游标查询mybatis 如...
    99+
    2023-09-28
    mybatis java mysql
  • MySQL数据查询中如何使用集合/聚合函数查询
    小编给大家分享一下MySQL数据查询中如何使用集合/聚合函数查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL聚合函数如下:函数作用avg()返回某列的平均值count()返回某...
    99+
    2022-10-18
  • Mysql数据库慢查询常用优化方式
    目录慢查询日志概念一、数据库中设置SQL慢查询1、mysql慢查询相关配置参数介绍2、实现配置步骤二、分析慢查询日志三、常见的慢查询优化1、索引没起作用的情况2、优化数据库结构3、分解关联查询4、优化LIMIT分页四、常...
    99+
    2023-05-05
    mysql如何优化慢查询 如何优化慢查询sql 优化mysql查询速度
  • 如何使用Workbench查询mysql数据库
    这期内容当中小编将会给大家带来有关如何使用Workbench查询mysql数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先通过点击电脑开始→选择Mysql Wor...
    99+
    2022-10-18
  • 怎么在MySQL中使用DQL命令查询数据
    怎么在MySQL中使用DQL命令查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SELECT 语法SELECT [AL...
    99+
    2022-10-18
  • mysql数据库中分页查询的使用方法
    这篇文章给大家分享的是有关mysql数据库中分页查询的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用:把行按照字段分组Select column,...
    99+
    2022-10-18
  • 6、【MySQL】使用DQL命令查询数据(二)
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:乐趣国学的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:MySQL数据库学习之旅 ...
    99+
    2023-09-07
    mysql 数据库 sql
  • 查询mysql数据库表单和使用函数介绍
    下文主要给大家带来查询mysql数据库表单和使用函数,希望这些内容能够带给大家实际用处,这也是我编辑查询mysql数据库表单和使用函数这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。单表查询准备一张...
    99+
    2022-10-18
  • MySql中使用JSON_TABLE 函数来实现json类型的数据查询
    使用 MySQL 8.0.4 及以上版本提供的 JSON_TABLE 函数来实现查询 id 在 3、4、5… 中的数据,示例如下: SELECT *FROM table_nameCROSS J...
    99+
    2023-10-06
    mysql json 数据库
  • MySql中使用正则表达式查询的方法
    这篇文章给大家分享的是有关MySql中使用正则表达式查询的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。正则表达式常用来检索和替换那些符合魔种模式的文本。例如从一个文本文件中...
    99+
    2022-10-18
  • 如何使用MySQL进行高效的数据查询?
    如何使用MySQL进行高效的数据查询?MySQL是一种常用的关系型数据库管理系统,广泛应用于网站开发、数据分析等领域。在实际应用中,进行高效的数据查询对于提升系统性能和用户体验至关重要。本文将介绍如何使用MySQL进行高效的数据查询,并给出...
    99+
    2023-10-22
    MySQL 查询 高效
  • Mysql数据库条件查询语句如何使用
    小编给大家分享一下Mysql数据库条件查询语句如何使用,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!对于分析人员来讲,Mysql数据库应用最多的是select查询语句,此篇文章主要介...
    99+
    2022-10-18
  • 使用SpringCache进行缓存数据库查询方式
    目录SpringCache进行缓存数据库查询1、在SpringBoot的启动类上添加注解@EnableCaching2、在service的方法上添加对应的注解SpringCache ...
    99+
    2022-11-12
  • C#中如何使用LINQ查询数据
    C#中如何使用LINQ查询数据,需要具体代码示例LINQ(Language Integrated Query)是C#中的一种强大的查询语言,它可以帮助开发者简化对数据的查询和操作。本文将介绍如何在C#中使用LINQ查询数据,并提供具体的代码...
    99+
    2023-10-22
    C# 查询数据 C#中的关键词: LINQ
  • 如何使用PHP查询MySQL数据库中的所有记录
    PHP是一种非常流行的编程语言,它可以用来开发各种类型的Web应用程序和网站。在Web开发领域中,最常见的数据库管理系统是MySQL。在本文中,我们将探讨如何使用PHP查询MySQL数据库中的所有记录。在开始之前,我们需要确保已经安装了PH...
    99+
    2023-05-14
    php mysql 数据库
  • 怎么使用PHP查询MySQL数据库中的所有记录
    本篇内容介绍了“怎么使用PHP查询MySQL数据库中的所有记录”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、建立数据库连接在使用PHP查...
    99+
    2023-07-05
  • 如何使用SQL语句在MySQL中查询和筛选数据?
    如何使用SQL语句在MySQL中查询和筛选数据?MySQL是一种常用的关系型数据库管理系统,它提供了强大的 SQL 查询语言,可以帮助我们方便地查询和筛选数据。本文将介绍如何使用 SQL 语句在 MySQL 中查询和筛选数据,包括使用 SE...
    99+
    2023-12-17
    MySQL SQL查询 数据筛选
  • MySql中流程控制函数/统计函数/分组查询用法解析
    路漫漫其修远兮,吾将上下而求索,又到了周末,我继续带各位看官学习回顾Mysql知识。 上次说到了流程控制函数,那就从流程控制函数来继续学习吧! #五.流程控制函数 #1.if函数:if else的效果 IF(条件...
    99+
    2022-05-21
    MySql 流程控制函数 统计函数 分组查询
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作