假设我有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,使其更小。虽然我有一种落入压缩领域的感觉,但没有更好的事情出现在我的脑海里。)
答案 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
上添加一个索引,如果你做这样的查询,使它们比在列中存储位域效率高出许多倍。