假设我有 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/