【问题标题】:Can I create an index in mysql without invoking creation of a temporary table the size of my target table?我可以在 mysql 中创建索引而不调用创建目标表大小的临时表吗?
【发布时间】:2014-05-02 01:53:54
【问题描述】:

托管旧应用程序的 Mysql 5.05 仍然受到用户的喜爱。不幸的是,我充其量只是一个 hack dba,除非绝对必要,否则我对安全迁移到新版本数据库的技能非常犹豫。我们正在采购一个新的应用程序来接管旧应用程序的责任,但可能需要一年左右的时间。

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

话虽如此,我已经添加了列,但是对于没有索引的应用程序来说,它毫无价值。我推迟了添加索引,试图确定它是否会在创建索引时创建另一个巨大的、持久的“临时”表。任何人都可以让我深入了解:

  1. create index 和/或alter table create index 语句会导致创建与现有表大小相同的临时表吗?

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

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

【问题讨论】:

    标签: mysql indexing temporary


    【解决方案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 以免再次发生这种情况,以及如何安全地转储和重新创建所有数据库。

    最终,你可能想要

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

    【讨论】:

    • 嗨 Stuart - 感谢您提供完整但令人沮丧的回复。考虑到我刚刚向 ibdata1 文件添加了 25G 的临时 (?) 空间,现在创建索引会给我 另一个 分配 25G 的空间,还是我刚刚创建的空间适应另一个临时调整?
    • 你现在在ibdata1 文件中有 25GB 的“可用”空间,只是 InnoDB 不会把它还给文件系统。所以重复索引过程会用完文件内的 25GB 空闲空间用于临时表,然后在添加索引后释放它。
    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多