mysql - 关于存储分配给用户的约 40 亿 (2^32) 个号码的建议

标签 mysql nosql

我正在研究存储可能大量数据的策略,并且我想找到最好的存储技术。我愿意接受任何建议,MySQL、NoSQL、平面文件等等。

我在做什么:

  • 我将在一组用户中分发所有 4 字节整数。
  • 数字为 0 到 4,294,967,295,无符号 4 字节整数范围。
  • 用户可以拥有数千个这样的号码。
  • 预计有数千名用户,但可能性很小。
  • 数字将在一段时间内分发,而不是一次性分发
  • 使用 AWS、一些服务器和 EBS 卷

我主要关心的是存储空间。我需要以便宜的方式完成此操作,并且在 AWS 上需要花费一些钱来进行大批量操作。

我对以数学方式表示数字分配进行了一些研究,但我发现了太多问题。

要求

  • 对于分析和实时数据显示的检索效率较高。不一定要快如闪电,但要合理。
  • 我需要在用户 ID -> 号码和号码 -> 用户 ID 两个方向上进行查找
  • 存储空间尽可能小。
  • 内存使用量合理(小于 8 GB)。
  • 必须准确,号码丢失和号码分配错误都不能发生。

这是我迄今为止发现的内容:

存储与 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 比基于磁盘的解决方案更昂贵。

最佳答案

实际上,你只需要存储有用户的号码即可;如果您正在查找未存储的号码,您将得到一个空结果,因此您知道该号码尚未分配。

对于 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 亿个数字,而只需存储用户条目的数量。

关于mysql - 关于存储分配给用户的约 40 亿 (2^32) 个号码的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307502/

相关文章:

python - Python 的 NoSQL 数据库独立 ORM/ODM

mongodb - 什么时候不使用 NoSQL?

mongodb - 基础mongodb理论

php - MySQL 使用 RegEx 更新/选择列

sql - MYSQL - 连接两个表

php - 将数据保存到Mysql后在PHP中使用AJAX显示DIV

SQL:优化 DateTime 字段上的密集 SELECT

MySQL:使用(选择?)表中的结果进行批量更新的最快方法

javascript - AJAX jquery mobile php表单提交在没有刷新的情况下不会更新

Cassandra 批处理如果不存在条件