其中,纪录行为MySQL默认的行格式,适用于大多数的情况。纪录行采用变长方案以达到存储最优化,每一条记录中的字段长度不同,可以非常方便地添加或删除字段。但同时,由于其存储方式的特殊性,纪录行在更新时可能会导致记录“断行”,即新记录追加在原记录后面,而原记录的空间则无法被释放掉。
CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL DEFAULT '', `password` varchar(32) NOT NULL DEFAULT '', `age` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
除了默认的纪录行以外,MySQL还提供了动态行这种行格式。动态行将所有的变长字段集中排列,这样在修改记录时就不会使用原有记录的空间,而是新增加的记录会保存在表的末尾,从而避免了纪录行“断行”的问题。
CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL DEFAULT '', `password` varchar(32) NOT NULL DEFAULT '', `age` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
压缩动态行是一种为了节约存储空间而产生的行格式。这种行格式可以使用更少的存储空间来存储每一条记录,但是读写效率可能稍微低一些。
CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL DEFAULT '', `password` varchar(32) NOT NULL DEFAULT '', `age` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
固定行则是一种非常古老的行格式,早期的数据库软件大多采用这种行格式。固定行不支持变长字段,因此每一条记录的长度都是固定的。由于不用计算记录的长度,因此固定行的读写效率相对较高。
CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` char(20) NOT NULL DEFAULT '', `password` char(32) NOT NULL DEFAULT '', `age` tinyint(3) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;
综上所述,选择哪一种行格式应该根据不同的使用场景来确定。如果数据表中字段经常变更,可以选择纪录行或动态行;如果数据表中有很多的变长字段,可以选择动态行;如果需要节约存储空间,可以选择压缩动态行;如果数据表的记录长度固定,可以选择固定行。