MySQL 更改表内存增加

发布于 2024-12-09 00:12:28 字数 236 浏览 0 评论 0原文

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

I'm trying to alter 2000 tables by adding a column to each. I achieve this by using a for loop in C# and executing a query on each table name for a list of strings I have. It starts out fast but then gets slower and slower. The memory for mysql.exe increases from 50k to 375k in about 30 seconds. Why is it doing this? Once I do one alter table the memory should drop down again. Is some resource not being disposed of after each alter? A cache, or buffer? Garbage collection? I can't finish this for loop because it gets incredible slow after the 20th-25th alter table.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

泪意 2024-12-16 00:12:28

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

它执行以下步骤:

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

出于性能原因,它将尝试将数据和索引文件保留在内存中。
这就是您看到的内存增加。
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-deep/

When you issue a alter table statement to MySQL, it starts rebuilding the table.

It does the following steps:

  1. Copy the old table to a new file.
  2. Add a column to the new file definition .frm-file
  3. Add the column in the datafile in the new .myd-datafile, this requires rewriting the entire datafile.
  4. Go through all the rows in the new datafile to fill the new column with the default value
  5. If the new column has an index MySQL has to do steps 2,3,4 for the .MYI-indexfile as well.
  6. Rename the old datafile
  7. Rename the new datafile so it has the same name the old file had.
  8. Delete the old datafile

For performance reasons it will try to keep the new data and index file in memory.
This is the memory increase you are seeing.
MySQL will keep the table data in memory for some time and will only clear out the cache if the memory assigned to cache space in My.ini has been exhausted.

You can clear the cache by issuing:

RESET QUERY CACHE;

After every alter table statement.

See: http://dev.mysql.com/doc/refman/5.0/en/query-cache-status-and-maintenance.html
Read up on MySQL cache issues here: http://www.docplanet.org/mysql/mysql-query-cache-in-depth/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文