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

Ben*_*Ben 5 mysql database storage

我很难从MySql 5.5数据库中解释以下统计数据.

也许相关的侧面信息:一些表包含列TEXTMEDIUMTEXT列,并且50%它们中的大约有空值.我做optimize了占用大部分空间的桌子.

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

  2. 问题: 我不明白data_free如何在索引和数据长度相结合的情况下变得更大

 

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'
Run Code Online (Sandbox Code Playgroud)

结果:

total | free | data | index_data

19.5469   20.0000   18.1875 1.3594
Run Code Online (Sandbox Code Playgroud)

所以我有20MB data_free19.5MB data+index.怎么可能?

谢谢

Bil*_*win 7

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

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

此外,即使您不删除,也可能存在一些"浪费"的空间,因为当表空间文件的大小增加时,它们会被一大块页面扩展,由config选项确定,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,也不计算部分填充的页面.所以"浪费"的空间可能要大得多,但我们无从知晓.