Mysql InnoDB 比 MyISAM 更节省空间 ?

存储引擎 InnoDB 存储相同的数据需要的空间比 MyISAM 大,这是大家都知道的,因为MyISAM对数据进行了压缩。

但是今天我看到了一个奇怪的现象,相同的表,相同的数据,InnoDB占用的存储空间比MyISAM竟然要小。

创建一个表
CREATE TABLE `zf1` (
`id` int(11) NOT NULL,
`c` char(120) NOT NULL DEFAULT ''
) ENGINE=InnoDB

CREATE TABLE `zf2` (
`id` int(11) NOT NULL,
`c` char(120) NOT NULL DEFAULT ''
) ENGINE=MyISAM
这样的话,MyISAM比InnoDB 大

---------------------------------------------------------------------------------------------------------
CREATE TABLE `zf1` (
`id` int(11) NOT NULL,
`c` varchar(120) NOT NULL DEFAULT ''
) ENGINE=InnoDB

CREATE TABLE `zf2` (
`id` int(11) NOT NULL,
`c` varchar(120) NOT NULL DEFAULT ''
) ENGINE=MyISAM
这样的话,MyISAM比InnoDB 小

看到这个现象的时候,经过各方搜索,排查。终于发现了当表的字段是CHAR(分配固定空间)的时候,用MyISAM的话rows_format会默认使用fixed,这时候即使字段为空也会分配空间(而上面建表的时候c字段的默认值是空),而InnoDB的rows_format是compact,空值的情况不会分配空间,就造成了MyISAM看起来比InnoDB大。而当字段都是varchar(动态分配空间)的时候就不会出现这个问题。

因此,将上面那个有CHAR字段的MyISAM表的rows_format改成dynamic动态的,这时候char字段中的空值就不会被分配空间,就会看到MyISAM还是比InnoDB小。或者将所有char字段都填充成非空值,也是MyISAM小。

你可能感兴趣的:(数据库)