2009-07-09 36 views
0

我在20个表中有大约1000万行数据,我每个月处理一次。MySQL - 当我切换模式(数据库)时如何避免高负载?

我通过将这些表复制到新的模式(数据库)然后进行更改来完成此操作,因此更新不会针对正在查询的表运行。

为了使新的数据还活着,我曾尝试:

  1. 改变多数民众赞成编码到应用程序的数据库名称,以指向新的数据
  2. 运行的大RENAME TABLE语句,增加了一个前缀,例如OLD到活动表并将新表移动到活动数据库中

使用这两种方法时,服务器负载从大约0.1变为大于50,然后才逐渐恢复正常。如果可能的话,我想避免这种情况。

查询缓存关闭,我试过FLUSH TABLES并在更改后立即重新启动MySQL。

数据只从我的网站读取(未更新),所以我猜可能是Linux(我们使用RHEL5.3)缓冲5GB的数据,并不得不重新缓冲新数据。

有没有人对如何避免负载增加有什么建议?

回答

0

您看到的负载增加可能是由于MySQL用于提高性能的所有缓存都将包含特定于旧表的数据,并且在清除此数据之前将需要多次查询并用新表中的数据替换。

我的建议是,在你的应用程序逻辑中进行切换之前,对新表执行一些典型查询以“预热”高速缓存。您也可以实施一种方案,在为所有请求进行切换之前,将一小部分流量重定向到新表格一小段时间。

不要在MySQL中重命名任何表。这会让你的缓存更加糟糕。

+0

谢谢 - 我已经尝试将一部分流量重定向到新表以预热缓存 - 需要一点实验,但它看起来很有希望。 – Richard 2009-07-15 13:49:23