代码之家  ›  专栏  ›  技术社区  ›  Alexar

MySQL:在大表中添加字段

  •  3
  • Alexar  · 技术社区  · 15 年前

    我有一张20万张唱片的桌子。我想在其中添加一个字段:

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

    但这似乎是一个非常沉重的问题,而且需要很长时间,即使是在我的 四方AMD 带有4GB内存的PC。

    我在windows/xampp和phpmyadmin下运行。 在添加字段时,mysql是否有每个记录的业务? 或者我可以更改查询以使更改更快?

    3 回复  |  直到 15 年前
        1
  •  5
  •   MarkR    15 年前

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

    我不知道你用的是什么引擎,但我假设是Myisam。myisam复制数据文件,进行任何必要的格式更改-这相对比较快,而且不会比IO硬件将旧数据文件放入磁盘和将新数据文件移出磁盘所花费的时间长太多。

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

    如果它不能实现文件排序技巧,那么它的行为就好像您在每一行上都进行了一次插入,然后依次用每一行的数据填充索引块。这是一个痛苦的缓慢过程,结果与最佳指标相差甚远。

    您可以在处理过程中使用show processlist来判断它在做什么。”按文件排序修复“很好”,用keycache修复“很差。

    所有这些都将最多使用一个核心,但有时也会绑定IO(尤其是复制数据文件)。

    **有一些例外,例如删除InnoDB插件表上的辅助索引。

        2
  •  1
  •   Svetlozar Angelov    15 年前

    添加一个 NOT NULL 列中,需要填充元组。所以会很慢…

        3
  •  0
  •   Hartog    15 年前

    这将接触到20万条记录中的每一条,因为每个记录都需要用一个新的bool值进行更新,该值不会为空。

    所以,是的,这是一个昂贵的问题…你不能做任何事来加快速度。