mysql - 使用 InnoDB,我如何收回索引空间?

标签 mysql indexing innodb diskspace

我有一些大型 InnoDB 数据库,接近 1TB。

为了在使用替代存储时释放一些空间,我删除了一些未使用的 InnoDB 索引,希望它能释放一些空间。

它没有释放任何东西。

因为它是 InnoDB,引擎会使用分配的空空间来进一步插入和索引吗?

最佳答案

InnoDB 将数据存储在表空间中。默认情况下,只有一个表空间,所有数据库的数据都存储在一个文件中。这个文件里面有数据字典,表,还有索引。有一个全局参数 innodb_data_file_path 定义了这个表空间文件。它的语法类似于 ibdata1:256M:autoextend,这意味着开始时将创建一个大小为 256 MB 的文件,然后每当数据大小超过此大小时,文件将自动扩展。 innodb_autoextend_increment 变量在 MB 中定义每个增量应该是多少。

您将如何获得索引空间?

您应该首先备份所有 InnoDB 表并将 my.ini/my.cnf 中的设置更改为 innodb_file_per_table 并重新启动 MySQL 服务器。 现在导入这些表,现在每个表都有自己的表空间,可以在删除表时缩小大小。

这些是可能的解决方法:

  • 每个表的单独文件:InnoDB 提供此选项,其中每个表的数据(数据 + 索引)可以通过全局变量 innodb_file_per_table 存储在单独的文件中。
  • 固定表空间大小:解决表空间文件大小问题的一种方法是将表空间大小(删除自动扩展)固定为外推值。因此,当您达到极限时,您就知道是时候进行清理了。
  • 迁移到 MyISAM:对于您认为数据对于事务处理等而言不是那么重要的所有表(甚至数据库),将它们迁移到 MyISAM。

关于mysql - 使用 InnoDB,我如何收回索引空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11751792/

相关文章:

mysql - 阻碍构建这个跨数据库查询

混合 order by 语句需要 MySQL 查询

python - 使用函数从指定索引开始对 Python 中不同长度的列表求和

python - 具有不相等元素的 pandas datetime-indexed DataFrame 之间的操作

php - 如果发生错误,更新行和回滚 SQL 数据库的最佳方法是什么?

mysql - 使用 IP 连接到 Cloud SQL

mysql - ODBC 数据源管理未列出在 MySQL Workbench 5.2.43 中创建的新创建的数据库

database - 将文件索引到数据库

php - MyISAM vs Innodb 和 Innodb 相关表

java - 获取 org.hibernate.MappingException : No Dialect mapping for JDBC type: -4 exception?