【问题标题】:MySQL Alter Table Memory IncreaseMySQL Alter Table 内存增加
【发布时间】:2011-10-08 20:38:22
【问题描述】:

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

【问题讨论】:

  • 赞成,因为您的问题阻止了我编写一些代码以完全相同的方式做完全相同的事情。那谢谢啦! :-)
  • 为什么有 2000 张桌子? 50k 到 375k 是否正确?我的意思是.... 现在很少看到数据库软件使用少于 1MB 的内存。一台相当普通的机器可以运行接近 10.000 个 375KB 程序的实例。对吗?
  • 这是一个我的世界服务器。每个级别都有一个与之关联的表。内存在任务管理器(WINDOWS 7)中从 50k 开始,在我执行脚本时增加到 375k。
  • 表是 innodb 还是 myisam ?
  • Innodb。我只是要坚持下去,让它运行很长时间。到目前为止,脚本已经运行了一个多小时。有点奇怪。它将在 10 秒内添加 20 个表格。然后休息 5-10 分钟。

标签: c# mysql memory-management alter


【解决方案1】:

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

它执行以下步骤:

  1. old 表复制到一个新文件。
  2. new文件定义.frm-file中添加一列
  3. new.myd-datafile 中添加datafile 中的列,这需要重写整个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/

【讨论】:

  • 我每次ALTER后都加了reset query cache,内存还在增加。它还说有 0 行受到影响。
  • @MattM,内存从 50k 增加到 375k 很小,所以 不会导致任何缓慢,我们这里真正谈论的内存是多少?
  • 内存已达到 354,568K。但是现在我的 alter table 语句变得非常缓慢。每分钟 7 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多