在blob中存储数据与存储指向文件的指针之间有什么区别?

use*_*628 22 mysql blob sqldatatypes

我对blobMySQL中的数据类型有疑问.

我读到数据类型可用于存储文件.我还读到了另一种方法是将文件存储在磁盘上,并在数据库中包含指向其位置的指针(通过varchar列).

但我有点困惑,因为我已经读过blob字段没有存储在行中并需要单独的查找来检索其内容.那么与文件系统上的文件存储指针有什么不同?

Bru*_*ira 17

我读到数据类型可用于存储文件.

根据Blob 上的MySQL手册页,A BLOB是一个二进制大对象,可以容纳可变数量的数据.

由于它是专用于存储二进制数据的数据类型,它通常使用它来存储二进制格式的文件,是存储图像文件的Web应用程序的使用非常普遍.

对于Web应用程序,这将意味着你首先需要将您的文件转换成二进制格式,然后保存它,每次你需要找回你的文件时,你需要做的将它们转换回到它的原始格式的逆过程.

除此之外,在db中存储大量数据可能会降低它的速度.特别是在不专用于托管数据库的系统中.

我还读到另一种方法是将文件存储在磁盘上并包含指向其在数据库中的位置的指针

考虑到上述所有考虑因素,Web应用程序的一个常见做法是将文件存储在MySQL之外的其他位置,然后将其存储在数据库中.这种方法可以在处理大量数据时加速数据库.

但我有点困惑,因为我已经读过blob字段没有存储在行中并需要单独的查找来检索其内容.

实际上,这取决于您使用的存储引擎,因为每个引擎都会处理数据并以不同的方式存储它.对于适用于关系数据库的InnoDB引擎,您可能希望从MySQL性能博客中阅读有关blob如何存储在MySQL中的文章.

但在摘要中,在MySQL 5和转发上,blob存储如下:

Innodb在行页面上存储整个blob,或者只存储20个字节的BLOB指针,优先选择较小的列存储在页面上,这是合理的,因为您可以存储更多的列.

所以你现在可能正在考虑正确的方法是将它们存储为单独的文件,但使用blob存储数据有一些优点,第一个(在我看来)是备份.我管理一个小型服务器,我不得不创建另一个子程序,只是将存储为路径的文件复制到另一个存储磁盘(我们买不起合适的磁带备份系统).如果我设计我的应用程序来使用blob mysqldump,那么我需要的一切就是备份整个数据库.

存储blob用于备份的优点在这篇帖子中有更好的讨论,其中回答的人遇到了类似于我的问题.

另一个优点是安全性和管理权限和访问的容易性.MySQL服务器内的所有数据都受密码保护,您可以轻松管理用户访问谁和谁不访问的权限.

在依赖于MySQL权限系统进行身份验证和使用的应用程序中.这是一个加分,因为让我们说一个入侵者从你的磁盘或没有访问权限的用户检索图像(或像压缩文件这样的二进制文件)会有点困难.

所以我会这么说

如果您要管理MySQL及其中的所有数据,并且必须定期备份或打算更改甚至考虑将来的操作系统更改,并拥有合适的硬件并优化MySQL,请转到BLOB.

如果您管理MySQL(例如在Web主机中)并且不打算更改操作系统或进行备份,请坚持使用varchar指向文件的列.

我希望它有所帮助.干杯


mvp*_*mvp 9

如果存储数据是BLOB字段,那么您将其作为对象抽象的一部分.

BLOB优势:

  1. 如果要删除BLOB行,或者将其作为主/从表关系或整个表层次结构的一部分删除,您的BLOB将自动处理,并且与数据库中的任何其他对象具有相同的生命周期.

  2. 您的脚本无需访问除数据库之外的任何内容即可获取所需的所有内容.在许多情况下,直接文件访问可以打开如何绕过访问或安全限制的整个蠕虫.例如,对于文件访问,他们可能必须挂载包含实际文件的文件系统.但是在数据库中使用BLOB,无论您身在何处,您都必须能够连接到数据库.

  3. 如果将其存储在文件中并且文件被替换,删除或不再可访问,则您的数据库永远不会知道 - 实际上,您无法保证完整性.此外,使用文件时很难可靠地支持多个版本.如果您使用并依赖交易,则几乎不可能.

文件优势:

  1. 有些数据库处理的BLOB相当差.例如,虽然MySQL中的官方BLOB限制是4GB,但实际上默认配置只有1MB.您可以通过调整客户端和服务器配置来增加MySQL命令缓冲区,将其增加到16-32MB,但这在性能和安全性方面还有很多其他含义.

  2. 即使数据库没有一些奇怪的大小限制,与仅仅一个文件相比,它总是会有一些存储BLOB的开销.此外,如果BLOB很大,某些数据库不提供逐个访问blob的接口,或者stream它可能会对您的工作流程造成很大的阻碍.

最后,这取决于你.我通常会尝试将其保留在BLOB中,除非这会产生不合理的性能问题.


Bil*_*win 5

是的,不适合在同一页面中的MySQL blob存储在溢出页面上请注意,某些blob足够小,以至于它们与其他行一样存储,就像任何其他列一样.blob页面与其行存储的页面不相邻,因此它们可能会导致额外的I/O来读取它们.

另一方面,就像任何其他页面类型一样,blob页面可以占用InnoDB缓冲池中的内存,因此即使它们位于不同的页面上,随后读取blob也非常快.文件可以由操作系统缓存,但通常是从磁盘读取的.

以下是可能影响您决定的其他一些因素:

  • Blob以逻辑方式存储在一行中.这意味着如果删除该行,则会自动删除关联的blob.但是,如果将blob存储在数据库外部,则在从数据库中删除行后,最终会出现孤立的blob文件.您必须执行手动步骤来查找和删除这些文件.

  • 存储在行中的Blob也遵循事务语义.例如,在您提交之前,新blob或更新的blob对其他事务是不可见的.您还可以回滚更改.将blob存储在数据库之外的文件中会使这变得更加困难.

  • 当您备份包含blob的数据库时,数据库当然要大得多,但是当您进行备份时,您只需一步即可获得所有数据关联的blob.如果在外部存储blob,则必须备份数据库并备份存储blob文件的文件系统.如果需要确保从一个时刻捕获数据和blob,则几乎需要使用某种文件系统快照.

  • 如果使用复制,则确保blob自动复制到复制从站的唯一自动方法是将blob存储在数据库中.