我有一些大型 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/