mysql 中如何存储 blob
how blobs are stored in mysql
我了解到 mysql 的某些存储引擎可能会“在外部”存储 blob。
我的问题是:
- 将 blob 存储在外部 space 和不存储有什么好处
在线?
- 外部存储的 blob 如何与原始 blob 相关联
记录?
Blob 是“外部的”,因为它们可能不会与给定行的其余列存储在同一页上。它们仍然与它们关联的行存储在同一个表空间文件中。
优点是 blob 可以比单个页面大。 InnoDB 页面大小固定,默认为 16KiB。 Blob 可能高达 64KiB,而 Mediumblob 和 Longblob 可能分别高达 16MiB 和 4GiB。这显然需要好几页。
它们与行的关联方式因行格式而异。在所有情况下,如果给定的 Blob 恰好适合页面,它就会存储在页面中。也就是说,即使 Blob 允许最多 64KiB,您通常可以存储较短的内容。
如果Blob太长无法存储在页面中,有两种处理方式:
在冗余或紧凑的行格式中,前768字节与行一起存储,然后有一个指向Blob剩余部分开始存储的页面的指针。
在动态或压缩的行格式中,Blob 在行页中被替换为指向整个 Blob 开始页的 20 字节指针。
Blob 的外部页面被逐一分配,最多 32 页(1 兆字节的一半)。如果 Blob 大于该值,则一次分配 64 个页面 (1MiB)。
Text/Mediumtext/Longtext和Varchar/Varbinary也有类似处理。它们可以大于单个页面,因此它们可能需要存储在多个页面上。
我了解到 mysql 的某些存储引擎可能会“在外部”存储 blob。
我的问题是:
- 将 blob 存储在外部 space 和不存储有什么好处 在线?
- 外部存储的 blob 如何与原始 blob 相关联 记录?
Blob 是“外部的”,因为它们可能不会与给定行的其余列存储在同一页上。它们仍然与它们关联的行存储在同一个表空间文件中。
优点是 blob 可以比单个页面大。 InnoDB 页面大小固定,默认为 16KiB。 Blob 可能高达 64KiB,而 Mediumblob 和 Longblob 可能分别高达 16MiB 和 4GiB。这显然需要好几页。
它们与行的关联方式因行格式而异。在所有情况下,如果给定的 Blob 恰好适合页面,它就会存储在页面中。也就是说,即使 Blob 允许最多 64KiB,您通常可以存储较短的内容。
如果Blob太长无法存储在页面中,有两种处理方式:
在冗余或紧凑的行格式中,前768字节与行一起存储,然后有一个指向Blob剩余部分开始存储的页面的指针。
在动态或压缩的行格式中,Blob 在行页中被替换为指向整个 Blob 开始页的 20 字节指针。
Blob 的外部页面被逐一分配,最多 32 页(1 兆字节的一半)。如果 Blob 大于该值,则一次分配 64 个页面 (1MiB)。
Text/Mediumtext/Longtext和Varchar/Varbinary也有类似处理。它们可以大于单个页面,因此它们可能需要存储在多个页面上。