存储特定数字范围

时间:2018-02-07 17:02:14

标签: mysql node.js

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

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

1 - > 01

2 - > 10

4 - > 100

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

我为什么问这个问题; 我可以使用基数10而不是2执行上述操作,并最小化int可以使用的最大字节数。这很愚蠢,我认为将其设置为base10或2中的其他基数不会改变任何内容。

编辑:其他想法;

所以一种可能的解决方案是将它们组成16位数字,然后将它们转换为字符串,用分隔符连接它们,然后存储而不是数字。 (可能用一定的角色替换多个1或0,使其更小。虽然我有一种落入压缩领域的感觉,但没有更好的事情出现在我的脑海里。)

1 个答案:

答案 0 :(得分:1)

基于您的问题,我假设您正在优化空间

如果大多数用户拥有该套装中的许多数字,那么您描述的方式就是125字节是您可以做的最好的。您可以将其存储在BINARY(125)列中。在Node.js中,你可以只使用一个缓冲区(你可以使用一个普通的字符串,但应该使用一个缓冲区)来操作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上添加一个索引,如果你做这样的查询,使它们比在列中存储位域效率高出许多倍。