簡體   English   中英

MySQL(5.6)是否總是將整個查詢結果集緩存在內存/磁盤上?

[英]Does MySQL (5.6) always cache the entire result set for a query in memory/on disk?

我需要將一些非常大的MySQL表轉儲到csv(托管在RDS上,所以沒有SELECT INTO OUTFILE)。 這些表遠遠大於其服務器上的可用內存。

如果我使用帶有fetchmany()fetchone()的python框架執行SELECT * FROM a_big_table來獲取記錄, MySQL 5.6嘗試首先將整個表讀入內存(我希望這會導致緩存到磁盤),或者比這聰明嗎?

編輯:為了澄清,我的意思是將整個結果集存儲在MySQL緩存中(而不是Python!)。

第二次編輯:在第一次編輯中將“排序”錯字更改為“存儲”。 注釋對於這種情況仍然有用!

服務器上已使用的內存量由緩沖池大小配置設置定義。 幾乎無需擔心服務器端發生了什么。 您的提取應用程序可能會成為瓶頸,因此寫入轉儲的速度可能比MySQL輸出的速度慢。 服務器在獲取數據時只負責填充緩沖區。 從服務器的角度來看,獲取一個更大的結果集比進行多個較小范圍的查詢更有效,對資源的需求也更少。

通常,在應用程序級別的數據庫調用中,不會返回整個結果集,而是會返回指向結果集的游標。 然后由應用程序語言(例如Python)來迭代該結果集並檢索記錄。

MySQL的Python連接器的文檔確認了這一點:

默認情況下,MySQL Connector / Python不緩沖或預取結果。 這意味着執行查詢后,您的程序將負責獲取數據 (重點是我的)。 當查詢返回大結果集時,這避免了過多的內存使用。 如果您知道結果集足夠小以至於可以一次處理所有內容,則可以通過將buffered設置為True來立即獲取結果。 也可以為每個游標設置此設置(請參見第10.2.6節“ MySQLConnection.cursor()方法”)。

在客戶端程序獲取查詢結果之前,通常不會讀取查詢生成的結果。 要自動使用和丟棄結果集,請將consume_results選項設置為True。 結果是讀取了所有結果,這對於大型結果集可能很慢。 (在這種情況下,最好關閉並重新打開連接。)

因此,從內存需求的角度來看,使用SELECT *查詢,然后一次寫入一個記錄或一次寫入記錄組的策略應該可行。 您的Python代碼僅需要盡可能多的內存來保存您嘗試寫入文件的當前記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM