使用PRIMARY KEY可以降低innodb文件的大小吗?

时间:2013-11-21 16:13:40

标签: mysql primary-key innodb filesize

我有点困惑,需要一些输入。

我在这里创建了2个表

CREATE TABLE `table1` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Value` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `table2` (
  `Value` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我查看temp文件夹中文件的大小时。它们都是96 kb

enter image description here

我只是在两列中插入10240项。

SELECT count(*) FROM temp.table1;
SELECT count(*) FROM temp.table2;

给出

10240
10240

如果我现在调查表格的大小,这就是我得到的。

enter code here

当我更改了我的一个innodb表并添加了AUTO_INCREMENT PRIMARY KEY时,我发现了这个,并且大小超过了3 GB。

我的印象是innodb有一个内部PRIMARY KEY,以防一个未定义?但是如何减少1列的表,实际上占用更多的空间呢? table2中没有索引(内部PRIMARY KEY除外),PRIMARY KEY上定义了table1

这是否意味着内部innodb PK正在使用BIGINT

修改

将PK更改为BIGINT后,文件的大小现在相同。就这么简单。

这确实引发了另一个问题。 MySQL行的LIMIT是BIGINT的最大值(这是大的,但实际上有一个限制然后是正确的)?

1 个答案:

答案 0 :(得分:1)

也许这个答案不是你想要的。但如果您正在寻找如何减少InnoDB数据文件大小,Barracuda格式可以帮助您。 (如果你已经知道了,我会删除这个答案)。 Barracuda格式压缩InnoDB数据文件

让我们看看如何使用它。首先检查当前innodb_file_format:

mysql> show variables like 'innodb_file_format';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| innodb_file_format | Barracuda |
+--------------------+-----------+

innodb_file_format的默认值为Antelope,如果您想使用Barracuda,请将innodb_file_format = barracuda添加到my.cnf并重新启动。就是这样。

现在,Barracuda已启用,因此在创建表时,您可以指定KYE_BLOCK_SIZE(默认值为16KB)。如果设置为8KB,则表大小将重新设置为1/2,而不是16KB。如果是4KB或2KB,分别是1/4和1/8。

CREATE TABLE temp(...)
ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;

但建议 KEY_BLOCK_SIZE=8 。 4或2对文件大小有好处,但性能不好。但是在没有性能损失的情况下,8减少了50%。