1. DATA_FREE 是什么
The DATA_FREE column shows the free space in bytes for InnoDB tables.
DATA_FREE
是 InnoDB 表空间中没有使用的空间,每当从 InnoDB 表中删除了一行内容,该段空间就会被留空。而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大。
如下:
...
ENGINE: InnoDB
VERSION: 10
ROW_FORMAT: Compact
TABLE_ROWS: 45667473
AVG_ROW_LENGTH: 199
DATA_LENGTH: 9096413184
MAX_DATA_LENGTH: 0
INDEX_LENGTH: 10359996416
DATA_FREE: 252824256512
...
如上面所示,该表由于经常删除导致DATA_FREE
过大,已经超出表数据大小 10 多倍,表真正数据大小为:DATA_LENGTH(9096413184) + INDEX_LENGTH(10359996416)。
2. 如何取回DATA_FREE
的空间
有多种方法,可以根据不同的情况选择。
方法一
1. mysqldump 出所有数据库数据;
2. 删除数据库数据,保留 schema;
3. `/etc/my.cnf`设置参数`innodb_file_per_table=1`;
4. 删除 ibdata1, ib_logfile0 and ib_logfile1 ;
5. 重启 MySQL;
6. 导入数据。
方法二
mysql> optimize table table_name;
方法三
删除旧表,创建新表;
ref:
http://stackoverflow.com/questions/9731853/what-does-information-schema-tables-data-free-mean-in-mysql
http://dba.stackexchange.com/questions/69765/how-to-reclaim-data-free-in-innodb-tables
http://dba.stackexchange.com/questions/16341/how-do-you-remove-fragmentation-from-innodb-tables
http://dev.mysql.com/doc/refman/5.5/en/tables-table.html