【问题标题】:MySQL blob: how to get just a subset of the stored dataMySQL blob:如何仅获取存储数据的子集
【发布时间】:2011-09-26 14:07:40
【问题描述】:

我想使用 MYSQL 作为大量文件的存储系统。 我只想读取/写入存储在列中的一部分数据(数据存储为字节),因此我不必将整个文件加载到应用程序中(因为它可以大于 GB)。 因此,简而言之,我希望在 blob 列中进行随机读/写访问,而不会将整个数据加载到内存中。 是否有可用于执行这些操作的功能?谢谢。

【问题讨论】:

    标签: mysql blob


    【解决方案1】:

    您可以尝试这种方法。将文件的元数据(如路径、名称等)存储在数据库中,并将文件存储在目录下。 从数据库中,您可以获取文件路径并以随机访问模式读取文件。使用文件偏移量,您可以获得所需的存储数据子集。

    【讨论】:

      【解决方案2】:

      你可以使用例如MID() [1] 切割部分 BLOB;虽然我更喜欢将文件存储在文件系统中,而不是数据库中。 MySQL 在 BLOB 上的表现相当差。

      [1] http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_mid

      【讨论】:

        【解决方案3】:

        MySQL 对待blobs the same as strings (more or less):

        BLOB 值被视为二进制字符串(字节字符串)。它们没有字符集,排序和比较是基于列值中字节的数值。

        所以所有常用的字符串函数都适用于 blob。特别是,您可以使用 substring 来抓取 blob 的一部分。

        也就是说,将数 GB 的数据文件作为 BLOB 存储在关系数据库中并不是最好的做法。您最好将文件的元数据存储在数据库中,并将文件本身留在文件系统中;文件系统非常擅长管理文件,关系数据库擅长处理结构化数据。

        【讨论】:

        • 我知道这不是最好的选择,但是使用 mysql 你可以获得很大的灵活性:MySQL 支持集群,因此你可以在服务器之间分发文件。您可以备份数据库并恢复。此外,数据库会自动处理锁定。很久以前,我按照您描述的方法编写了一个处理大量文件的软件:这是浪费时间,因为对于每个操作,您都必须检查文件是否存在,是否被锁定,系统是否正在执行操作在上面。备份和恢复很痛苦,因为您必须让数据库与文件系统同步等等......
        • @hkproj:我并不是说将它们全部塞入数据库是犯罪,它不一定是最好的首选。 OTOH,您已经清楚地考虑了这一点,并以艰难的方式吸取了教训(这几乎是学习重要事物的唯一方法);这种事情通常归结为选择你想要处理的那种痛苦。我只是想我会提一下,以防你要犯错。
        • 感谢您的建议。我想这次我会使用 MySQL,只是为了尝试...xD。如果它不能很好地扩展,我会回到文件系统......至于可扩展性,我发现了一些分布式文件系统并考虑了 MySQL 提供的集群选项,所以目前我只是为这个软件设计最好的解决方案(在成本/时间/硬件方面)。更多建议将不胜感激。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2021-06-22
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 2016-01-18
        • 1970-01-01
        相关资源
        最近更新 更多