背景:
我创建了一个Web应用程序,希望能够合理扩展。我知道我不是Google或Twitter,但是我的应用为每个用户使用了大量的数据,因此对数据的要求很高。我想准备好合理扩展,而不必稍后重新构建所有架构。
我认为自己是软件开发人员,而不是数据库专家。这就是为什么我在这里发布。希望有更多数据库专业知识的人能给我建议。
由于用户数量相对较大,但没有Facebook号码,因此我希望拥有一个如下数据库:
一个“大桌子”:
- 2.5亿条记录
- 20列
- 大约100 GB的数据
- 具有索引的bigint(20)外键
- 有一个索引varchar(500)string_id列
- 有一个int(11)“值”列
其他4个表格:
- 每一千万条记录
- 每个约2-4 GB数据
- 每个表都有4-8列
- 一栏是datetime date_created
- 一列是varchar(500)string_id列
- 每个表中的一或两列将在联接中被选择
这些表之一用于存储平均值-其架构为bigint(20)id,varchar(20)string_id,datetime date_created和float average_value
我想做的 -两个相对昂贵的查询:
计算新的平均值:
- 使用外键,从大表中选择多达几百万条单独的记录。
- 计算新的平均值,按string_id分组。
- 将结果插入平均值表。
- 按照当前的构造,此查询使用两个联接。
为服务用户创建非规范化的只读记录:
- 使用外键从大表中选择1,000-40,000条记录中的任意位置。
- 通过字符串id列与最新记录上的其他四个表连接。
- 将结果插入到非规范化表中。
- 这些记录供前端使用以向用户显示信息。
- 按照当前的构造,此查询使用四个联接。
我计划在批处理后端数据库上运行所有这些昂贵的查询,这些查询会将其结果推送到处理用户请求的实时前端数据库服务器上。这些查询将定期运行。我还没有决定多久。平均查询可能每天进行一次。反规范化查询将需要更加频繁-也许每隔几分钟。
目前,这些查询中的每一个查询都在一台非常低端的计算机上的MySQL中运行,该计算机的数据集在“大表”中具有10万条记录。我既担心扩展能力,又担心扩展成本。
问题:
- 这种方法听起来不错吗?从全局角度看,这显然有什么问题吗?
- RDBMS是正确的工具,还是我应该看看Hadoop系列中的其他“大数据”解决方案?我倾向于使用RDBMS,因为数据是结构化的并且很好地适合于关系模型。但是从某种意义上说,据我了解,我可能不再能够使用RDBMS。真的吗?什么时候需要此开关?
- 能行吗 这些查询能否在合理的时间内运行?我可以等待几个小时来查询#1,但是查询#2应该在几分钟内完成。
- 从硬件角度我应该考虑什么?我的RAM和CPU瓶颈可能是什么?我认为在RAM中保留索引很重要。还有什么我应该考虑的吗?
- 在某个时候,我可能必须对数据进行分区并使用多个服务器。我的用例看起来已经属于该类别了,还是可以在一段时间内垂直扩展一台计算机?这样可以处理10倍的数据吗?100倍?