大数据量查询容易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个测试用例进行测试:

  1. 大数据量普通查询(27w条)

  2. 大数据量流式查询(27w条)

  3. 小数据量普通查询(10条)

  4. 小数据量流式查询(10条)

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

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

3.1.1. 查询耗时

27w 数据量用时 38 秒

3.1.2. 内存占用情况

使用将近 1G 内存

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

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

3.2.1. 查询耗时

27w 数据量用时 37 秒

3.2.2. 内存占用情况

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

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

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

3.3.1. 查询耗时

10 条数据量用时 1 秒

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

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

3.4.1. 查询耗时

10 条数据量用时 1 秒

四、总结

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

DEMO地址https://github.com/zlt2000/mysql-stream-query

(0)

相关推荐

  • Presto在滴滴的探索与实践

    文章作者:armsword 滴滴研发工程师 内容来源:滴滴技术 序曲:Presto在滴滴内部发展三年,已经成为滴滴内部Ad-Hoc和Hive SQL加速的首选引擎.目前服务6K+用户,每天读取2PB ...

  • MySQL群讨论:你使用了什么方法防止误删数据?

    MySQL群讨论,你都用了什么方法防止误删数据? 答: 根据大家的讨论,总结共有以下几个措施,供参考: 1. 生产环境中,业务代码尽量不明文保存数据库连接账号密码信息: 2. 重要的DML.DDL通过 ...

  • 【JDBC】CRUD操作

    JDBC的CRUD操作 向数据库中保存记录 修改数据库中的记录 删除数据库中的记录 查询数据库中的记录 保存代码的实现 package demo1;import java.sql.Connection ...

  • 在处理jsp读取mysql中遇到的问题记录

    在我第一次使用jdbc,来通过jsp读取mysql中遇到一些问题记录一下. 首先都是一个DBHelper.java的工具类, package util; import java.sql.Connect ...

  • 你还在用分页?试试 MyBatis 流式查询,真心强大!

    基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用. 如果没有流式查询,我们想要从数据库取 1000 万条记录而又没 ...

  • 你还在用分页?试试 MyBatis 流式查询,这个你知道吗?

    基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用. 如果没有流式查询,我们想要从数据库取 1000 万条记录而又没 ...

  • 使用内存映射文件MMF实现大数据量导出时的内存优化(Linux篇)

    前言 今天这篇博客是接我的上一篇博客 https://www.cnblogs.com/y-yp/p/12191258.html,继续介绍一下MMF在Linux上的用法 ps:本来本地调试完case,想 ...

  • 查找数据,用好定位功能,处理大数据量Excel不迷糊

    Excel是款功能性非常强的办公工具软件.同一个问题,Excel通常会用多种途径和方法提供选择.在不同的应用场景中,正确选择解决问题的方法,才能真正发挥和达到事半功倍的作用和效果.Excel的定位功能 ...

  • 大数据量高并发的数据库优化,sql查询优化

    一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. ...

  • LINQ标准查询运算符执行方式-非流式处理

    LINQ的延迟执行方式分两种,一种是流式,另一种是非流式.非流式处理运算符必须先读取所有源数据,然后才能生成结果元素. 非流式处理的运算符包括:GroupBy.OrderBy.OrderByDesce ...

  • 强大:MyBatis ,三种流式查询方法

    关于MyBatis的知识点总结了个思维导图分享给大家 基本概念 流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用. 如果没有 ...

  • 教育找不到客源?客户的转化率不高?试试运营商大数据怎么样??

    现在的这个互联网时代,越来越多的人从事运营商大数据这个行业,相信大家都很好奇运营商大数据的绝对优势究竟是什么,它究竟是有什么魅力,能够让那么多的人为它所倾倒,下面我们就来看一下它究竟有什么优势吧. 关 ...

  • 铁观音秋茶质优量减、十年最佳,茶叶大数据一窥安溪茶产业发展路径!

    近日,正逢安溪铁观音上市之际,"安溪铁观音秋茶产量减少,涨价30%-50%,但质量大幅提升"的消息不胫而走.不只是秋茶产量减少,今年安溪的春茶产量较去年同期减少约0.1万吨.在全球 ...