MySQL 流式查询

article/2025/9/18 13:46:40

大数据量查询容易OOM?试试MySQL流式查询

一、前言

  程序访问MySQL数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM)。其实在MySQL数据库中提供了流式查询,允许把符合条件的数据分批一部分一部分地加载到内存中,可以有效避免OOM;本文主要介绍如何使用流式查询并对比普通查询进行性能测试。

二、JDBC实现流式查询

使用JDBC的PreparedStatement/Statement的setFetchSize方法设置为 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个测试用例进行测试:

  1. 大数据量普通查询(27w条)
  2. 大数据量流式查询(27w条)
  3. 小数据量普通查询(10条)
  4. 小数据量流式查询(10条)

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

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

3.1.1. 查询耗时

27w 数据量用时 38 秒

file

3.1.2. 内存占用情况

使用将近 1G 内存 img

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

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

3.2.1. 查询耗时

27w 数据量用时 37 秒
img

3.2.2. 内存占用情况

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

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

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

3.3.1. 查询耗时

10 条数据量用时 1 秒
img

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

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

3.4.1. 查询耗时

10 条数据量用时 1 秒
img

四、总结

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

DEMO地址


http://chatgpt.dhexx.cn/article/m7OxY8Q9.shtml

相关文章

MySQL --- 数据库查询 - 条件查询

条件查询 我们知道从 MySQL 表中使用 SELECT 语句来查询数据,如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。 语法 SELECT 字段名 FROM 表名 WHERE 条件; 运算符表 BETWEEN 后面是最小值,AND 后面是最大值,…

Mysql条件查询json数据

前言 ❤Java学习路线个人总结-博客 ❤欢迎点赞👍收藏⭐留言 📝分享给需要的小伙伴 1、Mysql数据库对应数据 2、查询条件 #模糊查询JSON select * from test where json_value->$.name LIKE %是% #不等于空 SELECT * FROM test WHERE json_value->…

MySQL条件查询简单汇总

条件查询语法&#xff1a; select 查询列表 from 表名 where 筛选条件; 分类&#xff1a; 一、按条件表达式筛选 条件运算符&#xff1a;> < ! <> > < 二、按逻辑表达式筛选 逻辑运算符…

MySQL 条件查询

文章目录 MySQL 条件查询1.条件查询语法2.条件查询分类按条件表达式筛选按逻辑运算符筛选模糊查询 3.条件运算符的使用4.按逻辑表达式筛选5.模糊查询5.1 like5.2 between and5.3 in5.4 IS NULL 和 IS NOT NULL5.5 安全检测<>5.6 对比 IS NULL 和 安全检测<> MySQL …

MySQL查询之条件查询

前言 之前总结了MySQL查询中的 基础查询 接下来将在本篇进行MySQL中的条件查询的总结 条件查询语句 条件查询就是在基础查询的基础之上&#xff0c;添加判定条件&#xff0c;对数据进行筛选&#xff0c;查找到相对应的数据 这时我们就要用到一个新的子句——where where子…

MySQL条件查询

我们知道从 MySQL 表中使用 SELECT 语句来查询数据&#xff0c;如需有条件地从表中选取数据&#xff0c;可将 WHERE 子句添加到 SELECT 语句中。 SELECT 字段名 FROM 表名 WHERE 条件; 还有个运算符表: 运算符表 关系运算符功能>大于>大于等于<小于<小于等于等于…

MySQL——条件查询

目录 一、语法二、筛选条件的分类三、案例补充 一、语法 select 查询列表 from 表名 where 筛选条件 二、筛选条件的分类 1、简单条件运算符 &#xff08;大于&#xff09; >、 < 、、>、 <、 <>&#xff08;安全等于&#xff09;、 <> 等价!&#xf…

特征值篇2——特征子空间

下面我们证明特征值 λ \lambda λ对应的所有特征向量所组成的集合为一个子空间 方法1&#xff1a; 摘自 Linear Algebra and its applications David C. Lay 方法2&#xff1a; 摘自 The Linear Algebra a Beginning Graduate Student Ought to Know (Second Edition) Jonat…

高等数学-线性代数:已知特征值,求解特征空间的特征向量

高等数学-线性代数&#xff1a;已知特征值&#xff0c;求解特征空间的特征向量[练习]

特征空间在风险建模中的应用

上周日我报名听了萧老师主讲的公开课"风控模型开发之特征筛选"&#xff0c;今天想和大家分享一下课程的第一部分内容&#xff1a;特征空间。 目录 常用数据源介绍 特征衍生常见方法 特征回溯 特征筛选一般流程 如果各位感兴趣的话评论区与我留言互动&#xff0c…

深度理解矩阵的奇异值,特征值

文章目录 正交矩阵特征值分解——EVD矩阵特征值和特征向量定义特征值的含义分解过程详解 奇异值分解——SVD矩阵的奇异值与特征值有什么相似之处与区别之处 看了蛮多关于矩阵特征值&#xff0c;奇异值的文章&#xff0c;将他们全部整理出来以供复习。 在网上看到有很多文章介绍…

特征向量中心性

特征向量中心性的基本思想是&#xff0c;一个节点的中心性是相邻节点中心性的函数。也就是说&#xff0c;与你连接的人越重要&#xff0c;你也就越重要。 特征向量中心性和点度中心性不同&#xff0c;一个点度中心性高即拥有很多连接的节点&#xff0c;但特征向量中心性不一定…

MM2022 | 在特征空间中的多模态数据增强方法

MM2022 | 在特征空间中的多模态数据增强方法 【写在前面】 每小时&#xff0c;社交媒体和用户生成的内容平台上都会发布大量的视觉内容。为了通过自然语言查询查找相关视频&#xff0c;文本视频检索方法在过去几年中受到了越来越多的关注。引入了数据增强技术&#xff0c;以通…

机器学习(一)--输入空间、特征空间、输出空间

注&#xff1a;在此讨论的内容默认是针对监督学习 一、输入空间 直白点&#xff0c;输入‘X’可能取值的集合就是输入空间&#xff08;input space&#xff09;。输入空间可以是有限集合空间&#xff0c;也可以是整个欧式空间。 二、输出空间 同样的&#xff0c;输出‘Y’可能…

特征空间、(数据集)线性可分:线性(二分类)模型

文章目录 二分类问题特征空间线性可分线性分类模型 在学习 SVM 时发现自己没能很好地理解在线性模型中充当决策函数角色的 符号函数Sign()&#xff0c;说明对线性模型的理解还不够到位&#xff0c;下面主要梳理一下对数据集 “线性可分”概念以及其它相关概念的一些理解&…

【数学和算法】特征值、特征向量、特征空间,变换矩阵的行列式和特征值

可以参考马同学的博客&#xff1a; 如何理解矩阵特征值&#xff1f; 也可以参考B站小崔说数的视频教程&#xff1a;【线性代数的本质】特征值/特征向量的几何涵义 矩阵的特征值和特征向量定义&#xff1a; 1、特征值是线性代数中的重要概念&#xff0c;设A是n阶方阵&#xff0c…

机器学习中的特征空间

声明&#xff1a;这篇博文主要是对参考文献中的那个PPT的学习之后记下的一些笔记&#xff0c;整理出来与大家一起分享&#xff0c;若笔记中有任何错误还请不吝指出&#xff0c;文中可能会使用到原作者的一些图&#xff0c;若侵犯到作者的权益&#xff0c;还请告知&#xff0c;我…

JQuery按name属性选择元素

方法1&#xff1a;使用name属性选择器 name属性选择器可用于按name属性选择元素。此选择器选择值与指定值完全相等的元素。 语法&#xff1a;[name“nameOfElement”] 示例&#xff1a; 输出&#xff1a; 方法2&#xff1a;使用javascript按名称获取元素并将其传递给jQuer…