MySQL:在大表中添加一个字段

时间:2010-03-05 12:17:24

标签: mysql performance

我有一张约有200,000条记录的表格。我想为它添加一个字段:

 ALTER TABLE `table` ADD `param_21` BOOL NOT NULL COMMENT 'about the field' AFTER `param_20`

但它似乎是一个非常繁重的查询,它需要很长时间,即使在我的 Quad amd PC上也有4GB内存。

我在windows / xampp和phpMyAdmin下运行。 在添加字段时,mysql是否与每条记录都有业务往来? 或者我可以更改查询,以便更快地进行更改吗?

3 个答案:

答案 0 :(得分:5)

在几乎所有情况下,MySQL都会在ALTER **期间重建表。这是因为基于行的引擎(即所有这些引擎)必须这样做才能以正确的格式保留数据以进行查询。这也是因为您还可以进行许多其他更改,这些更改还需要重建表(例如更改索引,主键等)

我不知道你正在使用什么引擎,但我会假设MyISAM。 MyISAM复制数据文件,进行任何必要的格式更改 - 这相对较快,并且不太可能花费比IO硬件可以获取旧数据文件和新数据文件更长的时间。

重建索引真的是杀手锏。根据你配置的方式,MySQL将:对于每个索引,将索引列放入文件存储缓冲区(可能在内存中但通常在光盘上),使用其filesort()函数对其进行排序(快速排序)通过递归复制两个文件之间的数据(如果它对于内存来说太大),然后根据排序的数据构建整个索引。

如果它不能执行filesort技巧,它就会像在每一行上执行INSERT一样,并依次用每行的数据填充索引块。这非常缓慢,导致远离最佳索引。

您可以在此过程中使用SHOW PROCESSLIST告诉它正在做什么。 “通过filesort修复”很好,“使用keycache修复”很糟糕。

所有这些都将使用AT MOST一个核心,但有时也会受到IO绑定(特别是复制数据文件)。

**有一些例外,例如在innodb插件表上删除二级索引。

答案 1 :(得分:1)

您添加NOT NULL列,需要填充元组。所以它会很慢......

答案 2 :(得分:0)

这会触及每条200.000条记录,因为每条记录都需要使用新的bool值进行更新,该值不会为空。

因此;是的,这是一个昂贵的查询...没有什么可以做的,以使它更快。