我正在尝试通过向每个表添加一个列来更改2000个表。我通过在C#中使用for循环并在每个表名上执行查询以获得我拥有的字符串列表来实现此目的。它开始快,但后来变得越来越慢。 mysql.exe的内存在大约30秒内从50k增加到375k。它为什么这样做?一旦我做了一个改变表,内存应该再次下降。每次更改后是否有一些资源没有被处理掉?缓存还是缓冲区?垃圾收集?我无法完成这个for循环,因为它在20-25变更表之后变得非常缓慢。
答案 0 :(得分:2)
当您向MySQL发出alter table
语句时,它会开始重建表。
执行以下步骤:
old
表复制到新文件。 new
文件定义.frm-file new
.myd-datafile中的数据文件中添加列,这需要重写整个数据文件。 new
数据文件中的所有行,以使用默认值填充新列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/