我有一列称为状态的列,该列具有以下值:draft
,active
,published
,archived
。我想将它们存储为VARCHAR
并将它们映射到Enum
类。
该表可能有数百万行,我对几种存储此信息的方法所节省的空间感到好奇。
一种方法是在主表上使用带有table_states
列的id, state
表和state_id
。
另一种方法是将状态存储在主列上但建立索引。
我的理解对吗,内部索引字符串列的存储方式与前面提到的方法类似吗?
有问题的数据库是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空间节省索引字符串列为枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48874120/