2011-03-12 105 views
17

我正在編寫一個將要上傳和刪除很多文件的應用程序,我通常只是將這些文件移動到服務器中的一個文件夾中,並將其命名爲id。但據我瞭解,MySQL也可以讓我存儲二進制數據(文件)什麼時候會是更好的選擇?什麼時候推薦使用MySQL BLOB?

請使用了堅實的論據,就像當 不使用BLOB將意味着性能 改進?

P.S:如果有問題,我正在使用MyISAM。

謝謝。


UPDATE:

相關問題
- Storing Images in DB - Yea or Nay?
- To Do or Not to Do: Store Images in a Database(感謝塞巴斯蒂安)

更新2

在數據庫中存儲文件是 不是需要我想要知道什麼時候 這是不是存儲 在文件夾一個更好的主意。

回答

12

閱讀:

結束

如果你偶爾需要檢索 圖像,它必須是可用上 幾個不同的網絡服務器。但我認爲這幾乎是。

  • 如果沒有可用的 幾臺服務器,它總是更好地 把它們在文件系統中。
  • 如果有 可用在幾個服務器和 實際上有某種在 系統負載的,你需要某種形式的 分佈式存儲。
+1

即使在這種情況下,我認爲memcached可能是一種更好的方法來「分發」圖像文件 - 將圖像保存在一個位置/服務器中,並在一次命中時將其存儲在memcache中,並在多個Web服務器/請求中使用它。 – Suman 2012-04-03 22:18:55

9

如果您正在使用MyISAM數據庫引擎,則可以對BLOB字段進行索引,以便您可以使用數據庫對文件執行快速搜索。

將文件存儲在BLOB字段中的另一個好處是可以比磁盤上的文件(不需要目錄遍歷,打開,讀取,關閉)更有效地訪問它們。

如果您計劃在MYSQL中存儲大量文件,通常將文件存儲在單獨的表中是一種很好的做法。這使您可以掃描元信息而不會絆倒blob。然後,當您實際需要獲取blob時,JOIN充分有效。

+0

那麼,在哪種情況下哪個更好? – amosrivera 2011-03-12 22:26:50

+0

當您知道您的應用程序需要時,您可以說哪種方法更好,但由於您正在使用MyISAM表,因此將文件存儲在數據庫中可能會給您更大的靈活性。 – Roman 2011-03-12 22:30:04

2

嗯,這是有點老了,但這篇文章使對BLOB存儲幾個像樣的參數:http://www.dreamwerx.net/site/article01

儘管不是性能增益本身,但在數據庫中而不是在目錄中擁有圖像和內容也應該消除盜鏈問題(假設這是一個公開可用的Web應用程序)。

0

你一定會使用MySQL嗎?如果沒有,請嘗試使用ODBMS或PostgreSQL來存儲文件,或者只存儲文件的路徑。例如參見this

+0

將文件存儲在數據庫中並不是必要的,我只是想知道這是一個更好的解決方案 – amosrivera 2011-03-12 22:32:29

0

Memcache不是一種替代解決方案,因爲您需要跨分佈式服務器管理冗餘和TTL,這使得維護變得更加困難。

在我看來,更好的解決方案是將公共靜態數據放在由設計和私有靜態數據分佈在數據庫上的CDN上,以便於在多個服務器上進行分發。

每次服務器在每次命中時都可以實現它自己的Memcache。

如果你已經存儲在文件系統中的數據,並希望將其遷移到數據庫中,最簡單的方法是創建一個鍵,下面的值表:

KEY =「/圖像/文件名」(串的文件系統位置),value = BLOB(實際文件)並構建一個包裝器,它將通過重寫規則和應用程序處理從數據庫中獲取這個包裝器。這樣,您可以對現有代碼使用完全透明度。