我在解释MySql 5.5
数据库中的以下统计信息时遇到了麻烦。
可能相关的辅助信息:某些表包含TEXT
和MEDIUMTEXT
列,其中约50%
个值为空。我做了optimize
占用大部分空间的表格。
问题:
我如何从Mysql文档中理解data_free:分配的空间由DDL
确定但当前未使用 - 因此基本上是行中的空值。这种解释是否正确,如果不正确完全定义了什么?
问题: 我不明白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'
结果:
total | free | data | index_data
19.5469 20.0000 18.1875 1.3594
所以我有20MB data_free
和19.5MB data+index
。怎么会这样?
由于
答案 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,也不计算部分填充的页面。所以“浪费”的空间可能要大得多,但我们无法知道它。