我试图通过向每个表添加一列来更改 2000 个表。我通过在 C# 中使用 for 循环并对每个表名执行查询以获取我拥有的字符串列表来实现这一点。它开始很快,但随后变得越来越慢。mysql.exe 的内存在大约 30 秒内从 50k 增加到 375k。为什么要这样做?一旦我做了一个改变表,内存应该再次下降。每次更改后是否没有处理某些资源?缓存还是缓冲区?垃圾收集?我无法完成这个 for 循环,因为它在第 20-25 个 alter table 之后变得非常慢。
问问题
1545 次
1 回答
3
当您向 MySQL 发出alter table
语句时,它开始重建表。
它执行以下步骤:
- 将
old
表复制到新文件。 - 向
new
文件定义 .frm-file 添加一列 - 在
new
.myd-datafile 中添加数据文件中的列,这需要重写整个数据文件。 - 遍历
new
数据文件中的所有行以使用默认值填充新列 - 如果新列有索引,MySQL 也必须为 .MYI-indexfile 执行步骤 2、3、4。
- 重命名
old
数据文件 - 重命名
new
数据文件,使其具有与old
文件相同的名称。 - 删除
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 回答