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

Ale*_*xar 3 mysql performance

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

 ALTER TABLE `table` ADD `param_21` BOOL NOT NULL COMMENT 'about the field' AFTER `param_20`
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*rkR 5

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

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

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

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

您可以在此过程中使用SHOW PROCESSLIST来判断它正在做什么."通过filesort修复"很好,"使用keycache修复"很糟糕.

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

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