【发布时间】: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 可以压缩/解压缩以备用)。