mysql - SQL Space 节省索引字符串列作为枚举

标签 mysql sql indexing

我有一个名为 state 的列,它具有以下值:draftactivepublishedarchived 。我想将它们存储为 VARCHAR 并将它们映射到 Enum 类。

该表可能有数百万行,我对存储此信息的几种方法节省的空间感到好奇。

一种方法是在主表上创建一个包含 id、state 列和 state_idtable_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/

相关文章:

SQL Server 如何仅选择表中存在的列

MySQL 忘记了自动为外键创建索引?

php - 将多个值与mysql中一个字段中的现有字符串进行匹配

sql - 更新零行然后提交?

mysql - 是否可以创建一个 exe 给我一个将东西写入数据库的接口(interface)?

mysql - DELETE FROM 抛出 SQL 错误 [1064] [42000] : (conn=5159) on a query,,而 SELECT 在该错误上

数据库索引示例

python - 如何删除列表形式的数据帧的重复索引?

mysql - 使用 left join 更新是否会锁定所有 MyIsam 表 mysql?

php - 3 个示例如何在 mysql 中输出 JSON。它们在 mysqli 中应该是什么样子?