MySql表优化导致比解决问题更多的问题

我有一个访问量很大的表,对应于用户的私人消息,超过10 M行。 当我运行用户删除过程时,过时的消息从表中删除,通常超过1000行。 当这个表被优化问题就产生了 ,因为这需要将近1分钟,在这个过程中表被完全locking,所有查询都被延迟。 其他大型表格也是如此。

问题是,如果没有重大性能问题,我是否可以简单地将表格永久性地优化? 或者我应该每周至less优化一次桌面,在低stream量的时候防止烦扰我的在线用户?

是的,performance会恶化 – 但我们不能告诉你有多快,或恶化的程度是可以接受的 – 因为你已经这样做了, 为什么你不衡量自己的影响

Akber正确地说,使用集群可以让你优化一个系统,而另一个系统仍然提供数据 – 但是为什么不把它们设置为主 – 主对 – 那么当你切换时不需要升级和降级。 而且不需要编写临时logging – 只需等待服务器滞后即可恢复,然后切换。 这也是一个非常好的备份解决scheme,当然还有高可用性。

另一个已经广泛用于这种练习的解决scheme是零宕机模式的变化 – 我知道有两个很好的实现: Percona的人用Perl写的,还有一个用 Facebook 写的PHP人。

我认为你的意思是重新组织表删除删除行占用的空间。

  • 最简单的解决scheme是通过复制:

    1. 将表或整个数据库复制到另一个mySQL服务器或实例(从属)
    2. 在从站上创build具有只读权限的用户。
    3. 使用只读用户将您的应用程序连接切换到从站。 新logging插入失败时显示适当的消息。
    4. 优化主设备,然后切换回来。
  • 可以使用更复杂的变化将临时logging写入从站的另一个表中,然后将其复制回主服务器,但涉及应用程序级别的更改。

  • 理想的解决scheme是有一个写队列和可写和只读表。 这种devise模式类似于被称为CQRS的模式 。 它基于最终的一致性,您的用户可能甚至不会注意到一个昙花一现。 所有的写事务最终都会被写入表中,但是当可写表被重新组织时,它们在队列中被保存的时候可能不会立即可用。