特殊格式文件(视频、声音等) 在数据库中的存储方式

问题描述:一般网站,对于用户上传的图片、视频、声音等特殊格式的数据是以本地文件的形式存储,然后把相应URL路径存放在数据库里呢;还是,将数据直接写到数据库里存放?

        答:多数网站,基本上采用的是第一种方式,即:文件存储+URL路径的模式 或者:OSS对象存储。

        首先,视频、声音、图片为非结构化数据,传统的关系型数据库主要是是针对结构化数据设计的,虽然有相应的字段格式支持存储,即:如果要把视频等文件存储到数据库的话,要使用大字段(例如: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可能出现以下错误

posted @ 2017-01-18 10:30  hello-Jesson  阅读(14103)  评论(0编辑  收藏  举报