mysql - mysql中整数数组的最小存储?

标签 mysql arrays storage diskspace

我有一个用户条目表,对于每个条目,我都有一个(2 字节)整数数组来存储(15-25,偶尔甚至更多)。数组元素将同时写入和读取,永远不需要更新或单独访问它们。他们的顺序很重要。将其视为数组对象是有道理的。

我有数百万个这样的用户条目,我想用尽可能少的磁盘空间存储这些条目。然而,我正在为 MySQL 缺少 Array 数据类型而苦苦挣扎。

我一直在考虑以下选项。

  • 按照 MySQL 的方式进行。创建一个表 my_data,其中包含列 user_iddata_iddata_int。为了提高效率,需要一个关于 user_id 的索引,每个整数总计超过 10 个字节。
  • 以文本格式存储数组。每个整数大约需要 6.5 个字节。
  • 制作 35-40 列(“足够”)并让 -32768 为“空”(因为该值不能出现在我的数据中)。每个整数需要 3.5-4 个字节,但有点难看(因为我必须对数组中的元素数量施加严格限制)。

在 MySQL 中有没有更好的方法来做到这一点?我知道 MySQL 有一个高效的 varchar 类型,所以理想情况下我将我的 2 字节整数作为 2 字节字符存储在 varchar 中(或类似的方法 blob),但我不确定该怎么做。这可能吗?应该怎么做?

最佳答案

您可以将它们存储为单独的 SMALLINT NULL 列。

在 MyISAM 中,这对每个值使用 2 个字节的数据 + 1 位空指示符。

在 InnoDB 中,空指示符被编码到列的字段起始偏移量中,因此它们不占用任何额外空间,并且空值实际上并不存储在行数据中。如果行足够小以至于所有偏移量都是 1 字节,那么这将对每个现有值(1 字节偏移量,2 字节数据)使用 3 个字节,对每个不存在的值使用 1 个字节。

这两种方法都比使用带有特殊值的 INT 来表示它不存在要好,因为每个值都需要 4 个字节的数据。

参见 NULL in MySQL (Performance & Storage)

关于mysql - mysql中整数数组的最小存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36782261/

相关文章:

java - Hashmap 中带有空格的 JSON - 来自 api

python - 在给定轴索引处替换 nd numpy 数组中的值

android - 如何将捕获的图像保存到代号为一的图库?

storage - Moodle 在哪里存储用户为其作业上传的文件?

hadoop - EMR 上的用例 HBase

mysql - 无法在 FROM 子句中指定更新目标表 'my_table'

mysql - 复合 key /复合 key /串联 key /聚合 key /候选 key

php - PDO 未在数据库中插入数据

javascript - 如果数组值已经存在,则删除 JavaScript

PHP PDO 最后插入 ID