返回顶部
首页 > 资讯 > 数据库 >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://lsjlt.com/news/10089.html(转载时请注明来源链接)

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

猜你喜欢
  • 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数据查询太多会OOM吗
    目录全表扫描对server层的影响全表扫描对InnoDB的影响InnoDB内存管理小结我的主机内存只有100G,现在要全表扫描一个200G大表,会不会把DB主机的内存用光? 逻辑备份时,可不就是做整库扫描吗?若这样就...
    99+
    2022-05-16
    MySQL数据查询OOM MySQL OOM
  • MySQL中的流式查询及游标查询方式
    目录一、业务场景二、罗列一下三种处理方式2.1 常规查询2.2 流式查询2.3 游标查询三、RowData3.1 RowDataStatic3.2 RowDataDynamic3.3 RowDataCursor四、JDB...
    99+
    2022-08-17
    MySQL查询 流式查询 游标查询 MySQL游标
  • MySQL中流式查询及游标查询的方式是什么
    这篇文章主要讲解了“MySQL中流式查询及游标查询的方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL中流式查询及游标查询的方式是什么”吧!...
    99+
    2024-04-02
  • MySQL数据查询中如何使用集合/聚合函数查询
    小编给大家分享一下MySQL数据查询中如何使用集合/聚合函数查询,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL聚合函数如下:函数作用avg()返回某列的平均值count()返回某...
    99+
    2024-04-02
  • MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
    MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现 MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现普通查询流式查询游标查询mybatis 如...
    99+
    2023-09-28
    mybatis java mysql
  • Mysql避免重复插入数据的4种方式
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下: 这里为了方便...
    99+
    2022-05-21
    Mysql 重复插入数据 MYSQL避免重复插入
  • 避免 MySQL 插入重复数据的 4 种方式
    最常见的方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦,因此需要对插入语句做特殊处理,尽量避开或忽略异常,下面我简单介绍一下,感兴趣的朋友可以尝试一下: 这里为了方便演示,我新建了一个us...
    99+
    2023-09-20
    mysql 数据库 sql Powered by 金山文档
  • MySQL数据库中怎么避免写入重复数据
    MySQL数据库中怎么避免写入重复数据,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们在 MySQL数据库进行表设...
    99+
    2024-04-02
  • MySQL中数据查询语句
    一、基本概念(查询语句)* ①基本语句 “select * from 表名;”,—可查询表中全部数据; 2、“select 字段名 from 表名;”,—可查询表中指定字段的数据; 3、“select di...
    99+
    2023-08-18
    mysql 数据库 sql
  • 如何使用Workbench查询mysql数据库
    这期内容当中小编将会给大家带来有关如何使用Workbench查询mysql数据库,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先通过点击电脑开始→选择Mysql Wor...
    99+
    2024-04-02
  • 怎么使用mysql进行数据查询
    要使用MySQL进行数据查询,您需要按照以下步骤进行操作: 连接到MySQL数据库。可以使用命令行或图形界面工具连接到MySQL...
    99+
    2024-04-09
    mysql
  • mysql怎么使用索引查询数据
    要使用索引查询数据,可以按照以下步骤进行: 1、创建索引:首先,在需要加索引的列上创建索引。你可以通过使用CREATE INDEX语...
    99+
    2024-04-09
    mysql
  • 怎么在MySQL中使用DQL命令查询数据
    怎么在MySQL中使用DQL命令查询数据?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。SELECT 语法SELECT [AL...
    99+
    2024-04-02
  • mysql数据库中分页查询的使用方法
    这篇文章给大家分享的是有关mysql数据库中分页查询的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用:把行按照字段分组Select column,...
    99+
    2024-04-02
  • 如何使用SQL语句在MySQL中查询数据
    要在MySQL中查询数据,可以使用SELECT语句。以下是一个简单的例子: SELECT * FROM table_name...
    99+
    2024-04-09
    MySQL
  • 应该避免在MySQL中使用mediumint吗
    在MySQL中使用mediumint数据类型是否应该避免取决于具体情况。mediumint数据类型在MySQL中是一个3字节的带符号...
    99+
    2023-09-27
    MySQL
  • Mysql数据库慢查询常用优化方式
    目录慢查询日志概念一、数据库中设置SQL慢查询1、mysql慢查询相关配置参数介绍2、实现配置步骤二、分析慢查询日志三、常见的慢查询优化1、索引没起作用的情况2、优化数据库结构3、分解关联查询4、优化LIMIT分页四、常...
    99+
    2023-05-05
    mysql如何优化慢查询 如何优化慢查询sql 优化mysql查询速度
  • 如何使用CQRS避免查询对模型设计的影响
    这篇文章主要为大家展示了“如何使用CQRS避免查询对模型设计的影响”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用CQRS避免查询对模型设计的影响”这篇文...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作