2010-04-29 68 views
4

在將GZIP文本數據插入數據庫之前,更大的應用程序和數據庫對GZIP文本數據常見嗎?存儲GZIP:編輯文本在MySQL?

我猜猜在實際文本字段上的任何全文搜索在再次解壓之前都不會工作?

回答

2

我從來沒見過這個做了很多工作,因爲它基本上防止從一個對MySQL的側上的數據做任何操作:

  • 沒有全文,是
  • 也沒什麼like,無=,沒有其他操作...

但是,如果您只使用數據庫來存儲該數據,而不是操縱它,那可能很有趣。

注意:您可能需要執行一些基準測試來衡量這可能會帶來的性能影響,因爲壓縮/解壓縮需要CPU!


之後,問題是:你會處理客戶端(PHP)端還是服務器端(MySQL)的壓縮?

在第二種情況下,MySQL提供的COMPRESS()函數可能會讓您感興趣。

0

壞主意。當磁盤空間低於1 GB時,額外的處理可以節省一些空間,這不會抵消額外的編程時間來完成這項任務(不僅僅是初始化,還記得維護)。

由於數據需要解壓縮/壓縮,這可能會使數據庫訪問速度變慢。索引不會在壓縮數據上正常工作,因爲您需要執行表掃描,解壓縮數據,然後進行比較。全文搜索也是一樣。

如果您必須這樣做,請不要使用gzip。使用內置的COMPRESS功能。

+6

在應用程序層中有一些有效的壓縮用例。每當你存儲大量的文本數據,但不需要進行搜索時,它是一個很好的候選項,例如歸檔日誌輸出。在數據到達數據庫之前對數據進行Gzip處理,可將1MB記錄下降到30k。儘管直接磁盤空間很便宜,但在運行mysqldumps時也必須考慮IO限制,或者在從應用程序服務器到數據庫服務器的網絡中進行訪問時。如果你在創建一個從設備時運行了一個鎖定的'mysqldump --master-data',你會希望減小db的大小。 – 2012-10-03 17:49:44

4

如果您在MySQL中使用InnoDB表類型並使用最新版本之一,那麼可以啓用compression on an InnoDB表本身。

它在低層管理,所以不會改變你的查詢或任何東西。從我讀過的內容來看,輕微的壓縮開銷通過減少磁盤IO並允許更多數據存儲在內存中的緩衝池中得到抵消。但是,您提到了InnoDB不支持的全文搜索,因此這可能不是一種選擇。

在MySQL中還有一個Archive表類型,但除了我相信的主鍵之外,您將失去索引功能。

另一種選擇是「打包」一個MyISAM表,但我相信這使得表只讀,並不像其他選項那樣壓縮。