【问题标题】:To BLOB or not to BLOB到 BLOB 还是不到 BLOB
【发布时间】:2018-01-30 03:29:03
【问题描述】:

我正在编写一个由 MySQL 数据库备份的 Web 应用程序,其中一个表可能会变得非常大(以 GB 为单位),其中很大一部分表操作正在写入。其中一个表列需要存储一个可能非常大的字符串序列。到目前为止,在我的测试中,它的大小已达到 289 字节,但为了安全起见,我想设计的最大大小为 1 kb。目前我将该列作为 MySQL MediumBlob 字段存储在 InnoDB 表中。

同时,我一直在用谷歌搜索确定 BLOB 与其他存储形式的相对优缺点。那里的信息太多了,也许太多了。我收集到的是,InnoDB 将 BLOB 的前几个字节(如果记忆对我有用,则为 789)存储在表行本身和其他地方。我也有这样的想法,如果一行每列有多个 BLOB(我的表没有),那么“其他地方”是每个 BLOB 的不同位置。除此之外,我的印象是访问 BLOB 数据比访问行数据慢得多(这听起来很合理)。

我的问题就是这样 - 鉴于我的 BLOB 大小和表的巨大潜在大小,我应该为一个 blob 烦恼吗?另外,如果我改用某种形式的行内存储,这不会对表能够容纳的最大行数产生不利影响吗?

MySQL 很简洁,可以让我摆脱开发环境中的几乎所有事情。但是……那不是真实的世界。

【问题讨论】:

  • 如果你想存储字符串,你应该使用 TEXT 而不是 blob,这样你的字符串就会被正确编码/解码
  • 另外,1000 字节的文本列不是您应该担心的。

标签: mysql blob innodb


【解决方案1】:

我确定您已经看过 here,但很容易忽略一些细节,因为在涉及 InnoDB 限制时需要牢记很多。

您的一个问题(表的最大大小)的简单答案是 64TBytes。使用可变大小类型将存储移动到单独的文件中肯定会改变行数的上限,但 64TBytes 是相当大的空间,因此比例可能非常小。

在表中存储一个 1KByte 字符串类型的列似乎是一个可行的解决方案,因为与 64TBytes 相比它也非常小。特别是如果您对查询速度有非常严格的要求。

另外,请记住,InnoDB 64TByte 限制可能会因您正在使用的操作系统的最大文件大小而降低。您始终可以将多个文件链接在一起,以便为您的表格腾出更多空间,但随后表格开始变得更加混乱。

【讨论】:

  • 谢谢!是的,我看过你提到的那篇文章,但错过了关于在本地存储小于一半页面大小的行。
  • @DroidOS 很高兴我能帮上忙。是的,正如我在上面写的那样,有很多细节需要牢记。
【解决方案2】:

如果 BLOB 数据超过 250kb,则不值得。在你的情况下,我不会打扰自己 BLOB'n。 Read this

【讨论】:

    猜你喜欢
    • 2011-07-21
    • 2018-05-07
    • 2018-06-11
    • 2015-03-18
    • 1970-01-01
    • 2014-06-02
    • 2011-08-16
    • 1970-01-01
    • 2014-07-04
    相关资源
    最近更新 更多