我可以在mysql中创建索引而无需调用目标表大小的临时表的创建吗?

时间:2014-03-24 15:40:37

标签: mysql indexing temporary

主持旧版应用程序的Mysql 5.05仍然得到了用户的热爱。不幸的是,除了最好的hack dba之外我什么都不是,除非绝对必要,否则我对安全迁移到新版本数据库的技能非常犹豫。我们正在采购一个新的应用程序来接管旧应用程序的责任,但可能还需要一年左右的时间。

无论如何,我前几天正在修补应用程序并在表中添加了一个列,该命令需要一段时间才能完成,同时几乎填满了托管数据文件的驱动器。 (表大约是25G)我相信这是创建临时表的功能。由于我不清楚的原因,在添加色谱柱后空间没有再次释放;也就是说,我丢失了大约25G的磁盘空间。我相信(?)这是因为数据库是用单个数据文件创建的;我不确定这些是什么,但我知道我必须在其他地方释放一些空间才能使驱动器进入可操作状态。

尽管如此,我已经添加了该列,但是对于没有索引的应用程序来说它毫无价值。我不想添加索引,试图弄清楚它是否会创建另一个大规模,持久的临时'索引创建时的表。那里的任何人都可以让我深入了解:

  1. 创建索引和/或alter table是否会创建索引语句导致创建与现有表大小相同的临时表?

  2. 如何在添加列时恢复添加到ibdata1的空间?

  3. 非常感谢任何和所有建议。

1 个答案:

答案 0 :(得分:1)

  1. MySQL prior to version 5.1 adds/removes indices on InnoDB tables by building temporary tables。它非常慢而且昂贵。解决这个问题的唯一方法是将MySQL升级到5.1,或者将表转储到例如mysqldump,删除它,使用新索引重新创建它,然后从转储中恢复它。

  2. 您根本无法缩小ibdata1。您唯一的解决方案是从头开始重建。有可能configure MySQL so it doesn't use one giant ibdata1 file for all the databases - 阅读该答案,它将解释如何配置MySQL / InnoDB,以便不再发生这种情况,以及如何安全地转储和重新创建所有数据库。

    < / LI>

    最终,你可能想要

    • 完全转储数据库
    • 升级到MySQL 5.1或更新版
    • 打开InnoDB每个表一个文件模式
    • 恢复转储。