我有点困惑,需要一些输入。
我在这里创建了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
我只是在两列中插入10240项。
SELECT count(*) FROM temp.table1;
SELECT count(*) FROM temp.table2;
给出
10240
10240
如果我现在调查表格的大小,这就是我得到的。
当我更改了我的一个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
的最大值(这是大的,但实际上有一个限制然后是正确的)?
答案 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%。