2017-08-16 35 views
0

我正在嘗試執行大約200,000個現有MySQL行的批量更新。更具體地說,我需要更新這些行中的八個空LONG BLOB字段,每個字段都有一個〜0.5 Mb的文件(使用了LONG BLOB是因爲存在一些特殊情況,其中存儲了很大的文件;但是,在這個批量中不考慮這些更新)。需要插入的文件本地存儲在磁盤上。優化大量更新現有MySQL數據的性能

我正在使用我編寫的MATLAB腳本循環訪問存儲這些文件的每個文件夾,讀取文件並將它們轉換爲十六進制表示,然後執行UPDATE查詢以使用八個文件更新八列爲每一行。

最初,事情跑得相當快;但是,我注意到,在幾千個完成查詢之後,事情真的開始放緩。我做了優化的MySQL和InnoDB系統變量了一些研究,並增加了對innodb_buffer_pool_size 25G和innodb_buffer_pool_instances至25

此修改後,再次事情加快,但另一對夫婦一千條查詢後放緩。我做了一些更多的研究,並試圖解決一些其他變量,如innodb_log_buffer_sizeinnodb_log_file_size將兩者都提高到100M,以查看會發生什麼。我還將innodb_write_io_threadsinnodb_read_io_threads設置爲16,因爲我在32 GB RAM的相當高端的服務器上運行。不幸的是,這些修改並沒有太大的幫助,現在我仍然堅持每個查詢需要幾分鐘才能完成。

有沒有人有任何建議或想法如何優化這個過程,並儘可能快地運行?

感謝,

+0

系統的吞吐量受到I/O操作(您硬盤的速度)的限制。它減慢通常是完全讀/寫緩存(包括可能已經緩存實際源文件的os緩存)的效果 - 但是最終*必須*寫入磁盤。因此,請告訴我們硬盤速度,(更慢)更新速度以及數據源是否與數據庫位於同一磁盤上,以估計速度是否太慢。你可以嘗試的事情:確保你使用索引標識你的行(例如'update ... where id = 4',id主鍵)。定期承諾,但不在每行之後;嘗試例如每100-500行。 – Solarflare

+0

嘿Solarflare的,我們使用一個RAID 5陣列的幾個4 TB SAS 6 Gb/s的7200轉服務器級的HDD構成總共約36 TB的存儲空間中的。源文件與數據庫確實在相同的存儲空間中。將源文件移動到另一個存儲空間會提高性能嗎?另外,我使用主鍵索引來標識行。 – joekleespies

+0

系統規格沒有多大幫助。將最大I/O(基準)與實際I/O進行比較。檢查例如Windows的資源監視器或Linux的iotop/dstat。與此相比,你(慢)更新吞吐量(例如,如果你插入每秒5行,每行恰好8倍0.5MB,讀,寫爲20MB /秒),以檢查是否I/O的瓶頸。具有不同的驅動器上的源文件,提高寫入速度(但如果不是,首先將它們複製都必須包含在執行時間)。也嘗試提交頻率。另外:也許只是將數據保存在文件系統/ smb共享中,而不是在數據庫中。 – Solarflare

回答

0

innodb_buffer_pool_instances = 8將有可能成爲開銷更少您的要求。

innodb_log_buffer_size = 10M在寫入innodb_log_file之前會'緩衝'在內存中已經累積10M之後。緩衝區的比率* 10 =日誌文件大小是合理的。

當innodb_log_buffer_size與innodb_log_file_size相同時,您實際上沒有緩衝。使buffer_size遠小於日誌文件大小。