2012-04-30 59 views
3

我需要構建一個包含佔用98%行大小的大BLOB的表。但是,此BLOB只會暫時保留在該行中,並將移至其他位置,然後將BLOB列設置爲NULL。 MySQL可以重用這個空間,還是將它永遠作爲行的一部分?如果它不能被自動重用,有沒有另外一種方法(比如優化表)可以用來手動回收這個空間?如果沒有,我可能需要找到另一個解決方案來處理這些特定的數據。MySql用InnoDB回收blob空間

+0

你可以將它存儲在MySQL之外,比方說Redis或其他鍵/值存儲? –

+0

數據將通過成批的異步過程移出到其他存儲(S3)。初始寫入必須是用於事務處理的mysql。在交易過程中,我可以將其移動到另一個商店,如Redis(或持久消息隊列),但這個過程必須是一條快速路徑,所以我不願意添加其他移動部分。這就是爲什麼我一直關注BLOB移到S3時是否/如何回收空間的原因。如果絕對無法回收,那麼Redis可能會成爲下一個選擇,因爲它是我們架構的一部分。 – AlexGad

回答

1

聽起來像你一定會更好使用Redis或甚至只是將您的blob存儲在文件系統上。這實際上是我推薦的;將數據保存在文件上並將文件名放在表格上。在異步上傳到s3完成後,將其設置爲空。如果您正在使用經過優化處理大型對象的文件系統,則這總是比插入數據庫的速度更快。

blob的存儲方式不僅取決於數據的長度,還取決於您實際使用的mysql版本。刪除的行總是可以重用,並且當後續插入不重用空間時,可以使用優化表恢復它。但優化表將鎖定該表。所以你第二次放緩系統。

+0

我其實很喜歡將blob保存到我們的SAN的想法。爲了保持速度一致,我們將進程分成兩個線程 - 一個節省mysql數據,另一個節點將blob保存到文件系統(實際上是SAN)。因爲它們並行運行,所以它將所有內容完全保存到mysql中。然後我們有一個真空過程,將文件移動到S3並將新位置標記爲mysql審計記錄。似乎像魅力一樣工作,即使在我們的預期負載下測試之後。 – AlexGad