特殊格式文件(視頻、聲音等) 在數據庫中的存儲方式


問題描述:一般網站,對於用戶上傳的圖片、視頻、聲音等特殊格式的數據是以本地文件的形式存儲,然后把相應URL路徑存放在數據庫里呢;還是,將數據直接寫到數據庫里存放?

        答:多數網站,基本上采用的是第一種方式,即:文件存儲+URL路徑的模式。

        首先,視頻、聲音、圖片為非結構化數據,傳統的關系型數據庫主要是是針對結構化數據設計的,雖然有相應的字段格式支持存儲,即:如果要把視頻等文件存儲到數據庫的話,要使用大字段(例如:Oracle,Mysql中的BLOB特殊二進制字段),但性能表現不佳。當然也可以采用非結構化的NoSQL數據庫,但是現有的NoSQL數據的存儲單元仍是針對小塊存儲設計的,也就是說,當面對較大的視頻格式等文件時,還是會有性能問題。

        數據庫里可以直接寫入上述特殊數據,但這種存儲方式對於用戶請求過程有明顯的缺點,占內存、速度慢、效率不高,會耗費較大的數據庫資源;因為用戶每次請求數據的時候,需要先訪問數據庫,從數據庫中查詢到相關文件,然后將文件以數據流的方式讀到數據庫內存,最后返回給用戶,這時就需要你的系統要有較大的內存,比較快的讀取速度,另外還會一定程度上影響數據庫的一些查詢性能。比如:數據庫表中如果添加用於存放視頻格式的二進制字段后,即使相應的二進制字段為NULL,查詢的時候不查詢該二進制字段,查詢速度仍然會下降很多,這種情況下想通過優化SQL語句提高性能,收效勝微。

      說了這么多,是不是選擇 直接存在數據庫就一定不好呢,其實不然!

      將視頻、圖片等格式的數據存放在數據庫的話,也有一定的好處,比如:

  1. 比較容易去重,可以將多余重復的數據利用SQL語句過濾刪除,操作方便

  2. 備份的時候,使用數據庫的備份方式簡單。(當然這也是相對的,數據的存儲越大,恢復越麻煩。)

      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可能出現以下錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM