【问题标题】:Use of PRIMARY KEY lowers innodb file size?使用 PRIMARY KEY 会降低 innodb 文件大小?
【发布时间】:2013-11-21 16:13:39
【问题描述】:

我有点困惑,需要一些意见。

我在这里创建了 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;

当我查看临时文件夹中文件的大小时。它们都是 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),并且在table1 上定义了一个PRIMARY KEY

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

编辑

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

但这确实引发了另一个问题。MySQL 行的 LIMIT 是 BIGINT 的最大值吗(这是很大的,但实际上有一个限制,对吧)? p>

【问题讨论】:

  • 如果您再次丢弃密钥会发生什么?它会再次变大还是仍然很小? MySQL 基本上会为这样的更改重新创建整个表,因此它可能会在此过程中重新组织数据,从而导致文件缩小。
  • 顺便说一句,400KB 的文件少了 3GB?您的意思是“少 30KB”吗?
  • innodb 内部 PK 是 BIGINT 类型,这就是大小不同的原因。但这给我带来了另一个关于 LIMIT to MySQL 的问题
  • @GolezTrol 不,这只是一个例子。但是我今天换了一张没有PK的直播桌,它缩小了3G。 (之前是25G,之后是22G)

标签: mysql primary-key innodb filesize


【解决方案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,如果要使用梭子鱼,请将innodb_file_format = barracuda添加到my.cnf并重启。就是这样。

现在,梭子鱼已启用,因此当您创建表时,您可以指定KYE_BLOCK_SIZE(默认值为 16KB)。如果设置为 8KB,则表大小与 16KB 相比减少到 1/2。如果是 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% 而没有性能损失。

【讨论】:

  • 感谢您的意见。此时磁盘空间不是问题仍然有4 T。但这是为了保持文件大小正确吗?你知道它是否也会影响索引的大小吗?
  • @KayNelson 是的,减少索引和数据。实际上 Barracuda 减少了 InnoDB Page。 InnoDB Page 既有索引又有数据。 (不像 MyISAM 的 MYD,MYI)
  • Jungsu 非常感谢您的意见。我将立即深入研究并了解有关梭鱼的更多信息。我正在运行 Antilope atm。再次感谢!
  • @KayNelson 我正在寻找你的结果。请让我知道你的最终结果。谢谢。就我而言,ibd 文件大小减少了大约 1/2。梭子鱼正在生产中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 2014-07-28
相关资源
最近更新 更多