我正在研究存储可能存在大量数据的策略,并且我想找到最好的存储技术。我对MySQL,NoSQL,平面文件,任何东西都有任何建议。
我在做什么:
我主要担心的是存储空间。我需要以便宜的价格执行此操作,并且在AWS上花费大量资金。
我已经做过一些关于用数学方法表示数字分配的研究,但我发现了太多问题。
要求
这是我到目前为止所发现的:
存储与2字节用户ID关联的所有4字节数字的下限是((4 + 2)* 2 ^ 32/1024/1024/1024)= 24 GB。
Cassandra是一个键/值对数据库。根据这个http://www.datastax.com/docs/0.8/cluster_architecture/cluster_planning我计算如果我使用每个4字节数字作为键和2字节用户ID作为值,我需要大约260GB的存储空间(没有复制)。
Redis在内存中。我认为这会消除它作为一种可能性,因为在AWS上会有很多内存疯狂。
我目前正在寻找关于MySQL和Mongo的类似信息。
这是我的问题。是否有任何可用于确定最佳解决方案的参考文献,或者是否存在我没想到的替代解决方案。
谢谢大家。
更新 - 我添加了一项额外要求,我需要根据用户ID和用户ID查找数字。此外,Redis在内存中,因此直接实现会使Redis比基于磁盘的解决方案更昂贵。
答案 0 :(得分:2)
实际上,您只需要存储拥有用户的号码;如果您正在寻找未存储的号码,您将得到一个空的结果,因此您知道该号码未被分配。
对于MySQL:
CREATE TABLE mashup
(
id bigint primary key,
user_id int,
index (user_id);
);
主键将确保'id'具有索引;另外,bigint有更多空间,所以你不会遇到像整数溢出这样令人讨厌的问题。然后,为每个用户插入如下记录:
INSERT into mashup VALUES (181870388, 90128);
想知道某个号码是否有用户?
SELECT user_id FROM mashup where id=xxxxx;
或者
SELECT COUNT(*) FROM mashup where id=xxxxx;
想知道用户有哪些号码?
SELECT id FROM mashup WHERE user_id=yyyyy;
美丽的是,你不会浪费存储所有40亿个数字的空间,只留下用户条目的数量。
答案 1 :(得分:0)
也许我们的例子可以提供帮助。我们正在使用couchdb
存储欧洲一个大国的整套移植电话号码。 map-reduce使其变得非常快。
我们的磁盘使用情况如下:
Usage: 8.2 GB
Numbers of documents: 22109793
Average characters per document: 272
希望这有助于您的选择。