mysql - 为什么切换到 MEMORY 引擎会增加表的大小?

标签 mysql memory

为什么将引擎从 MyISAM 更改为 MEMORY 会大大增加表的大小? 我正在尝试将包含 1300 万条记录的表更改为 MEMORY,并且我有 6GB 内存,在 Myisam 中,大小为 1.5GB,我想使用 MEMORY 引擎来控制这个大小,以便它符合我的内存限制。

我也定义了这个

{tmp_table_size=5.5G
max_heap_table_size=5.5G}

而且我仍然收到“表已满”错误,所以我唯一的猜测是,在转换为 MEMORY 引擎时,表大小需要在 10-15GB 左右。

谢谢

最佳答案

MEMORY(或 HEAP)表引擎仅支持固定行格式。

因此,VARCHAR(255) 列的存储方式与 CHAR(255) 类似:它每行占用 255 个字节,即使它只包含 10 个字符, 加上几个字节用于元数据(例如用于存储长度)。如果列是 UTF-8,每个字符占用 3 个字节,即每行 3*255,加上元数据。

请参阅 内存表的物理特性 https://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html :

MEMORY tables use a fixed-length row-storage format. Variable-length types such as VARCHAR are stored using a fixed length.

关于mysql - 为什么切换到 MEMORY 引擎会增加表的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16861090/

相关文章:

mysql - 为什么在 C 结构中分配字段时我会得到垃圾字符?

c - 如何使用指向另一个结构的指针释放结构的内存

c - 使用结构池正确处理内存

c++ - std::array 的 std::array 是否具有连续内存?

python - 使用 SQLAlchemy/Pandas to_SQL 填充 SQL 表时检查重复项

php - MySQL 和 PHP 将日期插入日期字段

php - SQL - 获取日期范围内的记录,包括。当日记录

c# - 连接未打开: MySql BeginTransaction

PHP 事务不回滚

c# - 出于分析目的写入和读取大文件