我对MySQL中的blob
数据类型有疑问。
我读到数据类型可用于存储文件。我还读到了另一种方法是将文件存储在磁盘上,并在数据库中包含指向其位置的指针(通过varchar列)。
但是我有点困惑,因为我已经读过blob字段没有存储在行中并且需要单独的查找来检索其内容。那么与文件系统上的文件存储指针有什么不同?
答案 0 :(得分:15)
我读到数据类型可用于存储文件。
根据Blob上的MySQL manual页面,A BLOB
是一个二进制大对象,可以容纳可变数量的数据。
由于它是一种特定于存储二进制数据的数据类型,因此通常使用它来存储二进制格式的文件,将图像文件存储在Web应用程序中非常常见。
对于Web应用程序,这意味着您首先需要将文件转换为二进制格式然后存储它,并且每次需要检索文件时,您都需要执行将它们转换回原始文件的相反过程。格式。
除此之外,在db MAY 中存储大量数据会使其慢下来。特别是在不专用于托管数据库的系统中。
我还读到另一种方法是将文件存储在磁盘上并包含指向其在数据库中的位置的指针
考虑到上述所有注意事项,Web应用程序的一个常见做法是将文件存储在MySQL以外的其他位置,然后将其路径存储在数据库中。在处理大量数据时,这种方法 MAY 可以加快数据库的速度。
但是我有点困惑,因为我已经读过blob字段没有存储在行中并需要单独查找以检索其内容。
实际上,这取决于您使用的存储引擎,因为每个引擎都会处理数据并以不同的方式存储它。对于适用于关系数据库的InnoDB引擎,您可能希望从MySQL Performance blog阅读有关blob如何存储在MySQL中的文章。
但是在摘要中,在MySQL 5和转发上,blob存储如下:
Innodb在行页面上存储整个blob,或者只存储20个字节的BLOB指针,优先选择较小的列存储在页面上,这是合理的,因为您可以存储更多的列。
所以你现在可能正在考虑正确的方法是将它们存储为单独的文件,但使用blob存储数据有一些优点,第一个(在我看来)是备份。我管理一个小型服务器,我不得不创建另一个子程序,只是将存储为路径的文件复制到另一个存储磁盘(我们买不起合适的磁带备份系统)。如果我将我的应用程序设计为使用blob,那么简单的mysqldump
将是我备份整个数据库所需的一切。
在this post上更好地讨论了为备份存储blob的优势,其中回答的人遇到的问题与我的相似。
另一个优点是安全性以及管理权限和访问的简便性。 MySQL服务器内的所有数据都受密码保护,您可以轻松管理用户访问谁和谁不访问的权限。
在依赖MySQL权限系统进行身份验证和使用的应用程序中。这肯定是一个加分,因为让我们说一个入侵者从你的磁盘或没有访问权限的用户检索图像(或像压缩文件这样的二进制文件)会有点困难。
所以我会说那个
如果您要管理MySQL及其中的所有数据,并且必须定期备份或打算更改甚至考虑将来的操作系统更改,并拥有合适的硬件并优化MySQL,请转到BLOB 。
如果您不会管理您的MySQL(例如在网络主机中)并且无意更改操作系统或进行备份,请坚持使用varchar
列指向您的文件
我希望它有所帮助。干杯
答案 1 :(得分:9)
如果您存储数据是BLOB字段,那么您将其作为对象抽象的一部分。
BLOB优势:
如果要删除BLOB行,或者将其作为主/从表关系或整个表层次结构的一部分删除,则BLOB会自动处理,并且与数据库中的任何其他对象具有相同的生命周期。 / p>
您的脚本无需访问除数据库之外的任何内容即可获取所需内容。在许多情况下,直接文件访问可以打开如何绕过访问或安全限制的整个蠕虫。例如,通过文件访问,他们可能必须挂载包含实际文件的文件系统。但是在数据库中使用BLOB,无论身在何处,您都必须能够连接到数据库。
如果将其存储在文件中并且文件被替换,删除或不再可访问,则您的数据库永远不会知道 - 实际上,您无法保证完整性。此外,使用文件时很难可靠地支持多个版本。如果您使用并依赖交易,则几乎不可能。
文件优势:
有些数据库处理的BLOB相当差。例如,虽然MySQL中的官方BLOB限制是4GB,但实际上默认配置只有1MB。您可以通过调整客户端和服务器配置来增加MySQL命令缓冲区,将其增加到16-32MB,但这在性能和安全性方面还有很多其他影响。
即使数据库没有一些奇怪的大小限制,与仅仅一个文件相比,它总是会有一些存储BLOB的开销。此外,如果BLOB很大,一些数据库不提供逐个访问blob的接口,或stream
它,这可能会对您的工作流程造成很大的阻碍。
最后,这取决于你。我通常会尝试将其保留在BLOB中,除非这会产生不合理的性能问题。
答案 2 :(得分: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存储在数据库中。
答案 3 :(得分:2)
更好的方法是将文件存储在filesystem文件夹中,并通过数据库中的varchar字段指向它们的路径。在数据库中保存文件的一个缺点是减慢速度或降低其性能。
答案 4 :(得分:2)
文件系统访问速度比通过数据库快。 Blobs列在索引/排序等方面存在一些缺点,如果您希望将来可以使用文件名列。
数据库也可以通过大型blob快速增长,然后备份等任务变得更慢。我会使用文件系统上的物理存储来访问数据库中的文件位置。