【问题标题】:Inserting large amount of records in MySQL database eats up memory在 MySQL 数据库中插入大量记录会占用内存
【发布时间】:2012-06-07 11:13:00
【问题描述】:

我在我的服务器上运行一个脚本,每分钟大约 2kB 插入大约 3000 条记录。服务器的内存似乎被此活动的数据堵塞了。 (20 分钟 100MB)

最终,我必须终止进程(HTTPD 和 MySQLd)甚至重新启动服务器以取回内存...

在插入大量记录时有什么方法可以节省内存?似乎 MySQL 以某种方式缓存了插入的数据...

谢谢!

【问题讨论】:

  • 这是一项功能,而不是错误。也许偶尔试试COMMIT
  • 你试过mysql_free_result吗?
  • 20 分钟 100MB 没什么了不起的,你能详细说明问题吗?你如何插入行?他们从哪里来?
  • 感谢您的回答!我并不是说 100MB 很多,但是 2 天后,内存有点满 :D 我会尝试包含一个 COMMIT。我认为最好偶尔做一次(例如每隔几分钟),我会看看 mysql_free_result!

标签: php mysql memory-leaks


【解决方案1】:

关闭 mysql 缓存? 只需禁用它:(取自here

SET GLOBAL query_cache_size = 40000;   # minimum as docs says
SET SESSION query_cache_type = OFF;

你可以给SHOW VARIABLES LIKE 'foo';检查这些值包含什么。

【讨论】:

  • 当前 query_cache_size 设置为 0 并且 query_cache_type = ON。我觉得很奇怪,一个 INSERT 可以从缓存中受益,但正如 wallyk 告诉我的那样,这是一个功能......
【解决方案2】:

有更好的方法来提高插入性能。

首先,您是否有可能在每十秒一次的查询中发送这些插入?或类似的东西。这里的想法是向服务器发送更少的查询。

另外,你使用 InnoDB 吗?该引擎更适合这种类型的 uf 使用。

【讨论】:

  • 这是一个 MyISAM 数据库...我不熟悉不同的数据库类型(有点新手 :) 我会看看这些类型...我还会结合一些插入,但这只会延迟不可避免的事情。我希望其他解决方案一起帮助控制内存!
  • 如果您找到上述问题的最佳解决方案,您会惊讶于您可能会取得哪些改进。
  • 关于开发的一点更新:我已将数据库引擎更改为 InnoDB。虽然这会产生更大的数据库,但它确实支持事务。这导致较低的内存使用量(COMMIT 有助于管理内存使用量)。禁用缓存是第二大变化。可悲的是,mysql_free_result 不起作用,因为它似乎不适用于 INSERT 查询......
  • 很遗憾,问题还没有完全解决。现在内存填充的速度变慢了,但它仍然在填充。有没有什么办法可以重置MySQL占用的内存,以免几天后内存完全填满?
  • 您多久将查询发送到数据库服务器?您可以尝试一下,例如通过在一次插入中发送更多数据来增加两次查询之间的时间。
猜你喜欢
  • 2013-06-03
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多