为什么MySQL的data_free大于数据和索引的组合?

时间:2013-10-10 16:06:09

标签: mysql database storage

我在解释MySql 5.5数据库中的以下统计信息时遇到了麻烦。

可能相关的辅助信息:某些表包含TEXTMEDIUMTEXT列,其中约50%个值为空。我做了optimize占用大部分空间的表格。

  1. 问题: 我如何从Mysql文档中理解data_free:分配的空间由DDL确定但当前未使用 - 因此基本上是行中的空值。这种解释是否正确,如果不正确完全定义了什么?

  2. 问题: 我不明白data_free如何比索引和数据长度组合更大

  3. select (sum(data_length) + sum(INDEX_LENGTH))/ 1024 / 1024 as total, 
    sum(data_free)/ 1024 / 1024  as free ,
    sum(data_length)/ 1024 / 1024 as data, 
    sum(INDEX_LENGTH/ 1024 / 1024) as index_data 
    from information_schema.tables t
    where t.TABLE_SCHEMA = 'foo'
    

    结果:

    total | free | data | index_data
    
    19.5469   20.0000   18.1875 1.3594
    

    所以我有20MB data_free19.5MB data+index。怎么会这样?

    由于

1 个答案:

答案 0 :(得分:6)

我假设您使用的是InnoDB,因为它是MySQL 5.5中的默认存储引擎。

InnoDB表空间在插入数据时会增长,但删除数据时文件不会缩小。因此,例如,如果您插入100万行,然后删除它们,该文件将有很多物理分配的空间,但不再使用。如果可以再次增长表空间文件,InnoDB将重新使用该空间。

此外,即使您不删除,也可能存在一些“浪费”的空间,因为当表空间文件的大小增加时,它们会被一大块页面扩展,由配置选项innodb_autoextend_increment确定以兆字节为单位。在这些页面被数据填充之前,它们是可用空间。

InnoDB报告的Data_free是中心表空间文件中空页“浪费”的空间量。它与NULL值无关,它与没有行的数据页有关。

此外,在MySQL 5.5中,默认情况下所有表共享一个名为ibdata的中央表空间。此表空间中所有表的data_Free将报告相同的数字,即整个表空间中空闲页面的空间量,而不仅仅是一个表。

您还可以为每个表(innodb_file_per_table=1)分配一个单独的表空间,对于单独表空间中的表,您将看到data_free的每个表的值不同。

Data_free仅报告完全空范围所留下的空间(范围是一个等于1MB的页面块)。您会注意到data_free始终是1MB的倍数。较小的空闲页面块不计入data_free,也不计算部分填充的页面。所以“浪费”的空间可能要大得多,但我们无法知道它。