【问题标题】:Why can MySQL 8 DDL be slow on a text-heavy table but not many records?为什么 MySQL 8 DDL 在文本较多的表上速度很慢,但记录不多?
【发布时间】:2022-08-19 02:27:12
【问题描述】:

我有一个包含两个简单列和两个 mediumtext 列的表,如下所示:

create table page (
  id bigint auto_increment primary key,
  status tinyint not null,
  content mediumtext,
  screenshot mediumtext
) row_format=compressed;

该表存储了网页的整个源代码和编码的屏幕截图,前者最大为 7mb,后者约为 5mb(但两列的平均值约为 500kb 到 2mb)。

page 表只有 50k 条记录,这在当今并不多,但大小约为 20GB。当我尝试添加一个新的简单列时,花了将近一个小时:

alter table page add column comment varchar(255);

同时,当我将相同的 comment 列添加到另一个具有 50k 条记录的表中时不text 列它会在几秒钟内发生。

这就是我好奇的地方:我认为text 列更像是指向实际数据的指针,因此添加新列应该不会花很长时间,因为我们没有接触text 数据。但考虑到持续时间很长,这几乎就像我们正在重组整个表,这令人担忧,因为它会使未来的 DDL 变得困难。在这种情况下可能会发生什么,我是否可以查询事务、锁定或元数据以获得更多信息?我有innodb_file_per_table=on。

另一个好奇心是我记得在同一个大表中添加了一个新列,但这几乎是一个即时操作。假设我没记错的话,是否有某些操作可以重组整个表而不是那些没有?

  • 这是在 InnoDB 引擎上吗?
  • 如果你不压缩你的表会发生什么?通过使用它,我假设性能不是您的主要目标。
  • 是否真的有必要保存所有网页并在数据库中有截图,小图片而不是很多,但是带有binrys数据的savib 5 mb看起来你应该重新考虑你的策略
  • @tadman - 这是在 innodb 上。
  • @stdunbar - 压缩可能是一个混合包,但我会尝试不压缩。在我们的大多数工作负载中,压缩有助于减少 IO 开销,这是我们的瓶颈(我们有大量的 CPU 可以压缩/解压缩以备用)。

标签: mysql sql


【解决方案1】:

我认为答案是整行都是“压缩的”。因此,将列添加到压缩表需要解压缩,添加列,然后重新压缩。

当我有大量文本时,我更喜欢在客户端压缩文本,然后将其存储到MEDIUMBLOB 中。这减少了网络流量和服务器 CPU 工作量。 (当然,CPU 对您来说不是问题。)

它还可以提供更好的压缩:

  • InnoDB 的压缩率约为 2:1
  • 几乎所有使用任何流行压缩工具压缩的文本都会提供大约 3:1 的压缩率。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 2013-07-23
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多