2012-06-02 123 views
1

我在我的服務器上運行一個腳本,每個〜2kB每分鐘插入大約3000條記錄。看起來服務器的內存被這個活動的數據堵塞了。 (在20分鐘100MB)在MySQL數據庫中插入大量記錄消耗內存

最後,我要殺死進程(httpd和mysqld的),甚至重新啓動服務器來取回記憶...

有什麼辦法將大量時節省內存的記錄?似乎MySQL以某種方式緩存插入的數據...

謝謝!

+0

這是一個功能,而不是一個錯誤。也許偶爾嘗試'COMMIT'? – wallyk

+0

你有沒有試過mysql_free_result? –

+0

20分鐘100MB沒有什麼令人印象深刻的,你能詳細說明問題嗎?你如何插入行?他們從哪裏來? – Sebas

回答

0

關閉mysql緩存? 只是禁用它:(從here拍攝)

SET GLOBAL query_cache_size = 40000; # minimum as docs says 
SET SESSION query_cache_type = OFF; 

你可以給SHOW VARIABLES LIKE 'foo';檢查一下這些值包含。

+0

當前query_cache_size設置爲0,query_cache_type = ON。我覺得這很奇怪,INSERT可以從緩存中受益,但正如wallyk告訴我的,這是一個功能... –

0

有更好的方法來提高插入性能。

首先,您是否有可能在每10秒鐘一次查詢中插入這些插入內容?或類似的東西。這裏的想法是將更少的查詢發送到服務器。

另外,您是否使用InnoDB?該引擎對於這種類型的uf使用更好。

+0

這是一個MyISAM數據庫...我不熟悉不同的數據庫類型(有點新手:)我會看看,然後在這些類型... 我會結合一些插入,但這隻會延遲不可避免的。我希望其他解決方案一起幫助保持記憶! –

+0

如果您找到上述最佳解決方案,您將會驚訝於可能達到的改進。 –

+0

開發一點點更新:我已經將數據庫引擎更改爲InnoDB。雖然這會產生更大的數據庫,但它確實支持事務處理。這導致內存使用率降低(COMMIT有助於管理內存使用情況)。禁用緩存是第二大變化。可悲的是,mysql_free_result不起作用,因爲它看起來不適用於INSERT查詢...... –