mysql5.0 带有一对数据库“A”和“B”,都带有大型 innodb 表。“删除数据库 A;” 冻结数据库“B”几分钟。那时什么都没有使用“A”,那么为什么这是一个如此密集的操作呢?
加分点:假设我们使用“A”,将数据上传到“B”,然后切换到使用“B”,我们怎样才能更快地做到这一点?删除数据库并不是人们通常必须一直做的事情,所以这有点离谱。
所以我不确定马特罗吉什的回答是否会帮助 100%。
问题是 MySQL* 在打开和关闭表周围有一个互斥锁(互斥锁),因此这基本上意味着如果一个表正在关闭/删除,则无法打开其他表。
This is described by a colleague of mine here: http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/
One excellent impact reduction strategy is to use a filesystem like XFS.
The workaround is ugly. You essentially have to nibble away at all the data in the tables before dropping them (see comment #11 on the link above).
继斯卡夫曼之后:
更改您的 my.cnf(并重新启动 MySQL)以包括:
innodb_file_per_table = 1
( http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html )
这将为您的数据库提供专用文件存储并将其从共享池中取出。然后它会让你做一些有趣的事情,比如将表/索引放在不同的物理磁盘上,以进一步拆分 I/O 并提高性能。
请注意,这不会更改现有表;您必须做一些工作才能将它们放入自己的文件中(http://capttofu.livejournal.com/11791.html)。
默认情况下,给定 mysql 服务器安装中的所有 innodb 数据库使用相同的数据文件物理池,因此可以想象“删除数据库 A”可能会影响数据库 B。由于“删除数据库”可能涉及大量重组 innodb 数据文件,可以想象这是一个阻塞操作,要么是因为操作的强度,要么是设计使然。
但是,我认为你可以让每个数据库使用不同的物理文件,虽然我自己没有尝试过,所以你必须自己弄清楚细节。如果做不到这一点,那么您可能需要在同一台机器上并排使用两个不同的 mysql 安装,这是完全可行的。