5

我在解释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'

结果:

total | free | data | index_data

19.5469   20.0000   18.1875 1.3594

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

谢谢

4

1 回答 1

8

我假设您使用的是 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 中,部分填充的页面也不计入。所以“浪费”的空间可能要大得多,但我们无从得知。

于 2013-10-10T16:35:42.450 回答