ALTER TABLE `table` ADD `param_21` BOOL NOT NULL COMMENT 'about the field' AFTER `param_20`
但它似乎是一个非常繁重的查询,它需要很长时间,即使在我的 Quad amd PC上也有4GB内存。
我在windows / xampp和phpMyAdmin下运行。 在添加字段时,mysql是否与每条记录都有业务往来? 或者我可以更改查询,以便更快地进行更改吗?
答案 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值进行更新,该值不会为空。
因此;是的,这是一个昂贵的查询...没有什么可以做的,以使它更快。