- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 MySQL 中有下表:
CREATE TABLE `ParaTable` (
`id_1` INT(10) UNSIGNED NULL DEFAULT '0',
`id_2` INT(10) UNSIGNED NULL DEFAULT '0',
`id_3` TINYINT(3) UNSIGNED NULL DEFAULT '0',
`id_4` TINYINT(3) UNSIGNED NULL DEFAULT '0',
`id_5` INT(10) UNSIGNED NULL DEFAULT '0',
`date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
INDEX `id_1` (`id_1`),
INDEX `id_2` (`id_2`),
INDEX `date` (`date`),
INDEX `id_3` (`id_3`),
INDEX `id_4` (`id_4`),
INDEX `id_5` (`id_5`),
INDEX `multi_index` (`id_1`, `id_3`, `id_4`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
它总共有大约 70,000,000 个条目,即使列可以为空,但没有一个条目在任何列中具有 NULL
(这里的表结构不是问题)。
如果我查看information_schema
,我可以看到索引长度为10272899072,数据长度为3201302528。
总共 12,850MB,或约 12.54GB。
这个数字是如何计算的?
SHOW TABLE STATUS ... LIKE ParaTable
的输出显示:
Rows: 68129609
Avg_row_length: 47
Data_length: 3201302528 (=3053MB)
Index_length: 10272899072 (=9797MB)
我读到关于数据存储大小in the MySQL manual并进行了以下粗略计算:
(int+int+tinyint+tinyint+int+时间戳)
4+4+1+1+4+4 = 每行 18 个字节(+ 6 位,因为每列都可以为空,我假设我可以将这 6 位计算为另一个字节并且安全,请参阅 the manual ) = 每行 19 字节。
(即使 6 位中的每一位在磁盘上占用 1 个字节(我猜这不太可能),每行也将占用 24 个字节。)
18 bytes * 70,000,000 rows = 1260000000B = ~1200MB
(19 bytes * 70,000,000 rows = 1330000000B = ~1270MB)
(24 bytes * 70,000,000 rows = 1680000000B = ~1600MB)
我不知道mysql索引占用了多少空间(我只能从SHOW TABLES
中获取值,但它是如何计算的?)。这是计算所需总大小时缺少的一环。但即使索引与它没有任何关系,Data_length
本身似乎也太高了。
为什么Avg_row_length
是47而不是我计算的18-24字节?我在这里缺少什么?
最佳答案
您错过了计算 InnoDB 存储这些行的所有开销。你应该有:
4 (INT)
+ 4 (INT)
+ 1 (TINYINT)
+ 1 (TINYINT)
+ 4 (INT)
+ 4 (TIMESTAMP)
+ 1 (Null bitmap, rounded up to whole bytes)
+ 5 (Row header)
+ 6 (ROW_ID: Implicit cluster key, because you are missing a PRIMARY KEY)
+ 6 (TRX_ID: Transaction ID)
+ 7 (ROLL_PTR: Rollback/undo pointer)
= 43 bytes per row
然后,您还需要考虑页面填充率(根据设计,页面填充率不会达到 100%),这至少会增加约 7%:
43
* 1 / (15/16)
= 45.86 bytes per row
此外,您还会在已分配但未使用的空间中产生开销。
所以实际上,每行获得约 47 字节一点也不坏。最坏的情况是开销消耗约 50%,导致表每行占用约 86 字节。
对于每个辅助键,请注意它们的空间消耗情况如下(以 id_1
为例):
4 (INT)
+ 1 (Null bitmap, rounded up to whole bytes)
+ 5 (Row header)
+ 6 (ROW_ID: Implicit cluster key)
= 16 bytes per row
* 1 / (15/16)
= 17.06 bytes per row
阅读以下有关 InnoDB 数据结构的文章以了解更多信息可能会很有用:
关于Mysql表大小与我的计算不符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23264800/
下面的代码应该显示我的表格中的随机帖子;它执行此操作,但它显示的帖子的 ID 与 URL 中的 ID 不同。 如何让它显示 URL 中的内容?谢谢。 $db = new PDO('mysql:host
我有一个自定义类,其中覆盖了 equals() 和 hashCode() 方法。我将该类的实例存储在 TreeSet 中。我无法弄清楚为什么 tree.contains(someObject) 返回
我正在尝试通过使用代码请求对healthkit中类别的授权: let healthKitStore: HKHealthStore = HKHealthStore() let healthKitType
我的代码的相关部分: 模型架构: Sequential( layers=[ BatchNormalization(input_shape=input_shape),
我是一名优秀的程序员,十分优秀!