首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在复制MySQL/MariaDB BLOB列时,会复制哪些数据?

问在复制MySQL/MariaDB BLOB列时,会复制哪些数据?
EN

Database Administration用户
提问于 2018-07-25 21:40:37
回答 1查看 247关注 0票数 1

让table_1按以下方式创建:

代码语言:javascript
复制
CREATE TABLE table_1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    some_blob BLOB
);

让table_2按以下方式创建:

代码语言:javascript
复制
CREATE TABLE table_2 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    some_blob BLOB
);

我想知道的是,在我运行这个表复制查询之后

代码语言:javascript
复制
INSERT INTO table_2 (id, some_blob) SELECT id, some_blob FROM table_1;

是复制table_1表的每个D6字段中的实际文本并将其存储在磁盘上,还是DB只复制指向包含BLOB数据的磁盘位置的指针?

为什么BLOB复制必须涉及实际内容的复制,原因如下:

复制BLOB内容是必要的,因为在table_1中对BLOB数据的更改也不应该在table_2中发生。如果只复制磁盘指针,那么一个表中的内容更改将反映在另一个表中,这违反了正确复制操作的属性。

现在,我介绍了DB可以实现以满足此复制操作的另一种方法。这个替代方案显示,上面的the参数不一定是真。在执行给定的INSERT语句期间,DB只能重复磁盘指针,然后每当发生UPDATE试图修改其中一个表中的BLOB数据时,DB才会在磁盘上分配更多空间来存储作为UPDATE查询一部分的新数据。一个BLOB数据段只有在不再存在任何磁盘指针时才会被删除,而且一个特定的BLOB数据段可能有许多磁盘指针指向它。

那么,MySQL/MariaDB在执行给定的INSERT语句时使用哪种策略,还是使用不同的策略?

为什么我要问这个问题

目前,我正在运行几个UPDATE查询,这些查询将大量BLOB数据从一个表复制到同一个数据库中的另一个表(超过1000万行BLOB数据)。查询已经运行了一段时间。我对性能是否如此缓慢感到好奇,因为我正在比较的一些列索引很差,因为这些查询实际上是在复制内容而不是磁盘指针,或者可能是因为这两个原因。

我在这个问题的例子中使用了一个INSERT,因为这简化了我试图理解的数据库内部的概念。

EN

回答 1

Database Administration用户

发布于 2018-07-25 22:40:38

另一份。

仅仅复制一个磁盘指针将需要“引用计数”,锁在现在没有的地方,等等。

您可以通过将BLOBs保存在一个单独的表中并以某种方式链接到它们来实现这样的功能。您可以使用MD5 (或其他摘要)来解压。然而,我怀疑这种好处会被bug的复杂性和潜在性所压倒。

“很长一段时间”-如果在同一个事务中复制了许多行,请注意,在崩溃的情况下需要额外的精力为ROLLBACK做准备。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/213238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档