MySQL改变表内存增加

时间:2011-10-08 20:38:23

标签: c# mysql memory-management alter

我正在尝试通过向每个表添加一个列来更改2000个表。我通过在C#中使用for循环并在每个表名上执行查询以获得我拥有的字符串列表来实现此目的。它开始快,但后来变得越来越慢。 mysql.exe的内存在大约30秒内从50k增加到375k。它为什么这样做?一旦我做了一个改变表,内存应该再次下降。每次更改后是否有一些资源没有被处理掉?缓存还是缓冲区?垃圾收集?我无法完成这个for循环,因为它在20-25变更表之后变得非常缓慢。

1 个答案:

答案 0 :(得分:2)

当您向MySQL发出alter table语句时,它会开始重建表。

执行以下步骤:

  1. old表复制到新文件。
  2. new文件定义.frm-file
  3. 中添加一列
  4. new .myd-datafile中的数据文件中添加列,这需要重写整个数据文件。
  5. 浏览new数据文件中的所有行,以使用默认值填充新列
  6. 如果新列有索引,MySQL也必须为.MYI-index文件执行步骤2,3,4。
  7. 重命名old数据文件
  8. 重命名new数据文件,使其与old文件具有相同的名称。
  9. 删除old数据文件
  10. 出于性能原因,它会尝试将new数据和索引文件保存在内存中 这是你看到的记忆增加。
    MySQL会将表数据保留在内存中一段时间​​,并且只有在My.ini中分配给缓存空间的内存耗尽时才会清除缓存。

    您可以通过发出以下命令清除缓存:

    RESET QUERY CACHE;
    

    每个alter table语句后。

    请参阅:http://dev.mysql.com/doc/refman/5.0/en/query-cache-status-and-maintenance.html
    阅读MySQL缓存问题:http://www.docplanet.org/mysql/mysql-query-cache-in-depth/