激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL中使用流式查詢避免數據OOM

MySQL中使用流式查詢避免數據OOM

2021-03-28 23:04zlt2000 Mysql

這篇文章主要介紹了MySQL中使用流式查詢避免數據OOM,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

 

一、前言

 

程序訪問MySQL數據庫時,當查詢出來的數據量特別大時,數據庫驅動把加載到的數據全部加載到內存里,就有可能會導致內存溢出(OOM)。

其實在MySQL數據庫中提供了流式查詢,允許把符合條件的數據分批一部分一部分地加載到內存中,可以有效避免OOM;本文主要介紹如何使用流式查詢并對比普通查詢進行性能測試。

 

二、JDBC實現流式查詢

 

使用JDBC的PreparedStatement/StatementsetFetchSize方法設置為Integer.MIN_VALUE或者使用方法Statement.enableStreamingResults()可以實現流式查詢,在執行ResultSet.next()方法時,會通過數據庫連接一條一條的返回,這樣也不會大量占用客戶端的內存。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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. 測試大數據量普通查詢

?
1
2
3
4
5
@Test
public void testCommonBigData() throws SQLException {
 String sql = "select * from my_test";
 testExecute(sql, false);
}

3.1.1. 查詢耗時

27w 數據量用時 38 秒

MySQL中使用流式查詢避免數據OOM

3.1.2. 內存占用情況

使用將近 1G 內存

MySQL中使用流式查詢避免數據OOM

 

3.2. 測試大數據量流式查詢

?
1
2
3
4
5
@Test
public void testStreamBigData() throws SQLException {
 String sql = "select * from my_test";
 testExecute(sql, true);
}

3.2.1. 查詢耗時

27w 數據量用時 37 秒

MySQL中使用流式查詢避免數據OOM

3.2.2. 內存占用情況

由于是分批獲取,所以內存在30-270m波動

MySQL中使用流式查詢避免數據OOM

 

3.3. 測試小數據量普通查詢

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

3.3.1. 查詢耗時

10 條數據量用時 1 秒

MySQL中使用流式查詢避免數據OOM

 

3.4. 測試小數據量流式查詢

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

3.4.1. 查詢耗時

10 條數據量用時 1 秒

MySQL中使用流式查詢避免數據OOM

 

四、總結

 

MySQL 流式查詢對于內存占用方面的優化還是比較明顯的,但是對于查詢速度的影響較小,主要用于解決大數據量查詢時的內存占用多的場景。

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

到此這篇關于MySQL中使用流式查詢避免數據OOM的文章就介紹到這了,更多相關MySQL 流式查詢內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://segmentfault.com/a/1190000038792484

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99久久自偷自偷国产精品不卡 | 久久精品视频在线免费观看 | 亚洲一区二区三区视频 | av在线免费播放网站 | 极品xxxx欧美一区二区 | 手机av在线电影 | 中文国产在线视频 | 在线观看视频日本 | 亚洲国产精品二区 | 日本一区二区不卡在线观看 | 无遮挡一级毛片视频 | 久久久www成人免费毛片 | 色悠悠久久久久 | av免费大全 | 日日操夜夜透 | 国产精品亚洲一区二区三区在线观看 | 999久久久国产999久久久 | 成人免费一区二区三区 | xnxx 日本19| 在线观看第一区 | 亚洲午夜久久久精品一区二区三区 | 免费看性xxx高清视频自由 | 99精品视频在线导航 | 久久久电影电视剧免费看 | 99国产精成人午夜视频一区二区 | 国产日产精品一区四区介绍 | 久久精品小短片 | 黑人一级片 | 国产福利不卡一区二区三区 | 91高清在线免费观看 | 免费男女乱淫真视频 | 日本人乱人乱亲乱色视频观看 | 国产一级毛片国产 | 国产精品久久久久久久久久东京 | 在线 日本 制服 中文 欧美 | 欧洲黄视频| 免费黄色大片在线观看 | 亚洲视频精选 | 中国字幕av| 内地av在线| 国产妞干网 |