mysql5.0带有一对数据库"A"和"B",两者都有大型的innodb表格。执行"drop database A;"会导致数据库"B"冻结几分钟。此时没有任何程序在使用"A",为什么这个操作如此耗费资源?
额外提示:如果我们需要使用"A",将数据上传到"B",然后切换到使用"B",如何更快地完成此操作?通常情况下,删除数据库不是一个经常需要做的事情,因此这有点超出了正常范围。
mysql5.0带有一对数据库"A"和"B",两者都有大型的innodb表格。执行"drop database A;"会导致数据库"B"冻结几分钟。此时没有任何程序在使用"A",为什么这个操作如此耗费资源?
额外提示:如果我们需要使用"A",将数据上传到"B",然后切换到使用"B",如何更快地完成此操作?通常情况下,删除数据库不是一个经常需要做的事情,因此这有点超出了正常范围。
所以我不确定Matt Rogish的答案是否会百分之百地有帮助。
问题在于MySQL*在打开和关闭表时有一个互斥锁(mutually exclusive lock),这基本上意味着如果一个表正在关闭/删除过程中,没有其他表可以被打开。
我的一位同事在这里描述了这个问题:http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/
一个很好的减少影响的策略是使用像XFS这样的文件系统。
解决方法很丑陋。您必须在删除表之前逐渐地删除表中的所有数据(请参见上面链接中的评论#11)。
继续阅读skaffman的内容:
修改你的my.cnf文件(并重新启动MySQL),加入以下内容:
innodb_file_per_table = 1
(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)
这将为您的数据库提供专用文件存储,并将其从共享池中取出。然后,您可以做一些有趣的事情,例如将表/索引放置在不同的物理磁盘上,以进一步分割I / O并提高性能。