問題描述:一般網站,對於用戶上傳的圖片、視頻、聲音等特殊格式的數據是以本地文件的形式存儲,然后把相應URL路徑存放在數據庫里呢;還是,將數據直接寫到數據庫里存放?
答:多數網站,基本上采用的是第一種方式,即:文件存儲+URL路徑的模式。
首先,視頻、聲音、圖片為非結構化數據,傳統的關系型數據庫主要是是針對結構化數據設計的,雖然有相應的字段格式支持存儲,即:如果要把視頻等文件存儲到數據庫的話,要使用大字段(例如:Oracle,Mysql中的BLOB特殊二進制字段),但性能表現不佳。當然也可以采用非結構化的NoSQL數據庫,但是現有的NoSQL數據的存儲單元仍是針對小塊存儲設計的,也就是說,當面對較大的視頻格式等文件時,還是會有性能問題。
數據庫里可以直接寫入上述特殊數據,但這種存儲方式對於用戶請求過程有明顯的缺點,占內存、速度慢、效率不高,會耗費較大的數據庫資源;因為用戶每次請求數據的時候,需要先訪問數據庫,從數據庫中查詢到相關文件,然后將文件以數據流的方式讀到數據庫內存,最后返回給用戶,這時就需要你的系統要有較大的內存,比較快的讀取速度,另外還會一定程度上影響數據庫的一些查詢性能。比如:數據庫表中如果添加用於存放視頻格式的二進制字段后,即使相應的二進制字段為NULL,查詢的時候不查詢該二進制字段,查詢速度仍然會下降很多,這種情況下想通過優化SQL語句提高性能,收效勝微。
說了這么多,是不是選擇 直接存在數據庫就一定不好呢,其實不然!
將視頻、圖片等格式的數據存放在數據庫的話,也有一定的好處,比如:
比較容易去重,可以將多余重復的數據利用SQL語句過濾刪除,操作方便
備份的時候,使用數據庫的備份方式簡單。(當然這也是相對的,數據的存儲越大,恢復越麻煩。)
3. 相較與原生存儲 更加安全(增加了數據庫的一層保護)
那么,什么樣的業務場景適合直接存放在數據庫中?
如果是一個小型的網站,像論壇等,平時用戶上傳、請求的該類特殊數據比較少,而又注重上述這種方式的優點的話,可以采用。
總結:
大多數情況下,如果要存儲圖片、文件、視頻等大文件對象,建議存成本地文件(提高性能的話采用分布式存儲),不建議直接存儲到數據庫中;對於目前主流的視頻網站,如何存放視頻文件呢?可以參考知乎的一篇文章。
附:Mysql數據庫中存入視頻格式文件測試
創建一個測試表test,使用longblob或者mediumblob
CREATE TABLE test (id INTEGER NOT NULL PRIMARY KEY,name VARCHAR (20),movie LONGBLOB);
然后把視頻文件導入
INSERT INTO test VALUES(1, 'titanic', LOAD_FILE("/tmp/good.mp4"));
注意,如果不使用longblob可能出現以下錯誤