我有一列称为状态的列,该列具有以下值:draftactivepublishedarchived。我想将它们存储为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/

10-09 08:48
查看更多