大資料量查詢容易OOM?試試MySQL流式查詢

2021-10-13 20:54:00 字數 2529 閱讀 5871

程式訪問mysql資料庫時,當查詢出來的資料量特別大時,資料庫驅動把載入到的資料全部載入到記憶體裡,就有可能會導致記憶體溢位(oom)。

其實在mysql資料庫中提供了流式查詢,允許把符合條件的資料分批一部分一部分地載入到記憶體中,可以有效避免oom;本文主要介紹如何使用流式查詢並對比普通查詢進行效能測試。

使用jdbc的preparedstatement/statementsetfetchsize方法設定為integer.min_value或者使用方法statement.enablestreamingresults()可以實現流式查詢,在執行resultset.next()方法時,會通過資料庫連線一條一條的返回,這樣也不會大量占用客戶端的記憶體。

public

intexecute

(string sql,

boolean isstreamquery)

throws sqlexception

else

//執行查詢獲取結果

rs = stmt.

executequery()

;//遍歷結果

while

(rs.

next()

)}catch

(sqlexception e)

finally

return count;

}

ps:上面的例子中通過引數isstreamquery來切換流式查詢普通查詢,用於下面做測試對比。

建立了一張測試表my_test進行測試,總資料量為27w條,分別使用以下4個測試用例進行測試:

大資料量普通查詢(27w條)

大資料量流式查詢(27w條)

小資料量普通查詢(10條)

小資料量流式查詢(10條)

@test

public

void

testcommonbigdata()

throws sqlexception

3.1.1. 查詢耗時

27w 資料量用時 38 秒

3.1.2. 記憶體占用情況

使用將近 1g 記憶體

3.2.1. 查詢耗時

27w 資料量用時 37 秒

3.2.2. 記憶體占用情況

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

3.3.1. 查詢耗時

10 條資料量用時 1 秒

3.4.1. 查詢耗時

10 條資料量用時 1 秒

mysql 流式查詢對於記憶體占用方面的優化還是比較明顯的,但是對於查詢速度的影響較小,主要用於解決大資料量查詢時的記憶體占用多的場景。

demo位址

掃碼關注有驚喜!

大資料量演算法

給40億個不重複的unsigned int的整數,沒排過序的,然後再給乙個數,如何快速判斷這個數是否在那40億個數當中 位圖思想解法 include stdio.h include stdlib.h include memory.h define max num 4294967295 int mai...

大資料量處理

看看這個,異曲同工,永遠不超時 該程式是針對非常龐大的資料庫開發的,沒有用迴圈 用途 對過萬條資料的資料庫字段內容批量替換 資料庫連線 dim beeyee dbname,connstr,conn,intsn1 dim content,num,intsn,intidno,strcodea,strco...

關於大資料量查詢報表優化

針對資料量巨大的報表查詢,總結了一下幾個處理方法 看乙個運用案例 多粒度 年月日,省 地市 熱點 ac ap 下每天20w條,每月800w條,自由選擇35天內資料的查詢。直接查詢頁面崩潰,運用了以下幾點,基本上能保證在1 2分鐘 100秒左右 內頁面相應載入。b 一 表分割槽 b 當某張表每天都有上...