MySQL 更改表内存增加
我试图通过向每个表添加一列来更改 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当您向 MySQL 发出
alter table
语句时,它会开始重建表。它执行以下步骤:
旧
表复制到新文件。new
文件定义中添加一列 .frm-filenew
.myd-datafile 中添加数据文件中的列,这需要重写整个数据文件。new
数据文件中的所有行,用默认值填充新列old
数据文件new
数据文件,使其与old
文件具有相同的名称。旧
数据文件出于性能原因,它将尝试将
新
数据和索引文件保留在内存中。这就是您看到的内存增加。
MySQL 会将表数据在内存中保留一段时间,只有当
My.ini
中分配给缓存空间的内存耗尽时才会清除缓存。您可以通过发出以下命令来清除缓存:
在每个
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:
old
table to a new file.new
file definition .frm-filenew
.myd-datafile, this requires rewriting the entire datafile.new
datafile to fill the new column with the default valueold
datafilenew
datafile so it has the same name theold
file had.old
datafileFor 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:
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/