gpt4 book ai didi

mysql - 为什么字符集从utf8mb4改为utf8后表的索引存储大小变大?

转载 作者:行者123 更新时间:2023-11-29 09:32:00 26 4
gpt4 key购买 nike

执行:alter table device_msg 转换为字符集 'utf8' COLLATE 'utf8_unicode_ci';"

正如我所料,表数据大小变小了。

但与此同时,表索引大小变大了?

发生了什么以及为什么?

ps:表数据大小和索引大小是通过information_schema.TABLES计算的

<小时/>

数据库引擎:InnoDB

表之前:

CREATE TABLE `device_msg` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`sn` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`time` datetime(3) NOT NULL,
`msg` json NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `device_UNIQUE` (`sn`,`time`)
) ENGINE=InnoDB AUTO_INCREMENT=62077733 DEFAULT CHARSET=utf8mb4;

之后的表格:

CREATE TABLE `device_msg` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`sn` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`time` datetime(3) NOT NULL,
`msg` json NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `device_UNIQUE` (`sn`,`time`)
) ENGINE=InnoDB AUTO_INCREMENT=62077733 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


之前:

totalSize: 2.14 GB
indexSize: 282.98 MB
dataSize: 1.86 GB
avg_row_len: 297B

之后

totalSize: 1.93 GB
indexSize: 413.97 MB
dataSize: 1.52 GB
avg_row_len: 260B

如果information_schema.TABLES的数据不准确,

如何做到正确?

最佳答案

  • 无论您显示的数字如何,utf8mb4 和 utf8(假设事先没有 4 字节字符)占用的空间是相同的。

  • ALTER 需要重建表和索引。

  • InnoDB 在 BTree 中构建数据和每个二级索引。

  • 根据将元素插入 BTree 的顺序,会发生或多或少的“ block 分割”。

所以,你不能确切地说是字符集更改还是重建导致索引变大而数据变小。

我说这不是字符集的变化。

关于mysql - 为什么字符集从utf8mb4改为utf8后表的索引存储大小变大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58514911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com