mysql - 存储特定数字范围的所有可能组合

标签 mysql node.js

假设我有 1000 个数字,从 1 -> 1000,并且用户可以拥有 1000 个组合中的任何一个(例如:4、25、353..)。 我怎样才能有效地将该组合存储在 MySQL 数据库中。

我的想法。我可以使用 2 的幂,并将每个数字存储在一个非常大的 int 中,例如:

1 -> 01

2 -> 10

4 -> 100

等等

因此,如果我碰巧得到数字 6 (110),我就知道用户拥有数字 2, 4 (2 | 4 = 6) 的组合。 所以我们可以有 2^1000 种组合,125 字节。但这根本没有效率,因为 bigint 有 8 个字节,我无法存储 在 MySQL 中不使用 vachars 等。Nodejs 也无法处理这个大数字(我也不会),最大为 2^53-1。

为什么我要问这个问题; 我可以用 base 10 而不是 2 来执行上述操作,并最小化 int 的最大字节数吗? 这很愚蠢,我认为将它设为 base10 或另一个 base 2 不会改变任何事情。 p>

编辑:补充想法;

因此,一种可能的解决方案是将它们制成 16 位数字的集合,然后将它们转换为字符串,用分隔符连接它们,并存储它而不是数字。 (可能会用某个字符替换多个 1 或 0,使其更小。虽然我有一种属于压缩字段的感觉,但我的脑海中没有更好的。)

最佳答案

根据您的问题,我假设您正在优化空间

如果大多数用户有很多数字,那么您描述的 125 个字节是您能做的最好的。不过,您可以将其存储在 BINARY(125) 列中。在 Node.js 中,您可以只使用 Buffer(您可以使用纯字符串,但应该使用 Buffer)来操作 125 字节的位域。

如果大多数用户在集合中只有几个元素,那么拥有一个包含两列的单独表格将占用更少的空间,例如:

user_id | has_element (SMALLINT)
---------------------
      1 | 4
      1 | 25
      1 | 353
      2 | 7
      2 | 25
      2 | 512
      2 | 756
      2 | 877

这也将使查询更清晰、更高效,可以执行简单的查询,例如 SELECT user_id FROM user_elements WHERE has_element = 25;。如果您执行这样的查询,您可能应该在 has_element 上添加索引,以使它们的效率比在列中存储位域高很多倍。

关于mysql - 存储特定数字范围的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48669395/

相关文章:

javascript - 如何获取Google的知识图 "people also search for"内容?

android - E/AndroidRuntime:致命异常 : AsyncTask #2

时间戳的MySQL分区查询

node.js - Mongoose - 在模型保存时创建引用

jquery - 获取 puppeteer 中元素的子元素

android - 如何使用 Node.js 与 Android 通信? (MySQL)

node.js - 如何在仅使用 IPv6 的 ubuntu 服务器中安装 Node 包

MySQL ODBC 更新查询非常慢

php - 为什么 MySQL 不存储来自 Android 应用程序的数据

php - 不同网站上的多个平台的单一登录