2

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

4

1 回答 1

3

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

它执行以下步骤:

  1. old表复制到新文件。
  2. new文件定义 .frm-file 添加一列
  3. new.myd-datafile 中添加数据文件中的列,这需要重写整个数据文件。
  4. 遍历new数据文件中的所有行以使用默认值填充新列
  5. 如果新列有索引,MySQL 也必须为 .MYI-indexfile 执行步骤 2、3、4。
  6. 重命名old数据文件
  7. 重命名new数据文件,使其具有与old文件相同的名称。
  8. 删除old数据文件

出于性能原因,它将尝试将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/

于 2011-10-08T20:53:21.820 回答