我有一个名为 state 的列,它具有以下值:draft
、active
、published
、archived
。我想将它们存储为 VARCHAR 并将它们映射到 Enum 类。
该表可能有数百万行,我对存储此信息的几种方法节省的空间感到好奇。
一种方法是在主表上创建一个包含 id、state
列和 state_id
的 table_states
表。
另一种方法是将状态存储在主列上但建立索引。
我的理解是否正确,索引字符串列在内部的存储方式与第一个提到的方法类似?
有问题的数据库是 MySQL,但我确信该问题也与其他数据库有关。
最佳答案
索引不会使字符串占用更少的空间。事实上,它增加了存储空间,因为索引是排序数据结构中字符串的副本。
您可能想使用 MySQL ENUM data type :
ALTER TABLE WhateverYourTableNameIs
MODIFY state ENUM('active','archived','draft','published') NOT NULL;
这使得列的存储每行仅占用 1 个字节,因为在内部字符串只是表定义的一部分,并且它们作为序数整数存储在每行上。列表中最多可以有 255 个枚举字符串,但每行仍占用 1 个字节。
另一方面,每次想要添加新值时,都需要 ALTER TABLE 来重新定义 ENUM 列表。
关于mysql - SQL Space 节省索引字符串列作为枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48874120/