背景:
我已经创建了一个web应用程序,我希望能够相当好地扩展。我知道我不是Google或Twitter,但我的应用程序为每个用户使用了相当多的数据,因此对数据的要求也相当高。我想做好准备,在不需要重新设计所有东西的情况下,进行合理的扩展。
我认为自己是一个软件开发人员,而不是一个数据库专家。这就是为什么我要在这里发帖。希望拥有更多数据库专业知识的人能给我提供建议。
由于用户数量相对较多,但与Facebook号码不同,我希望有一个如下所示的DB:
一张“大桌子”:
4其他表格:
其中一个表用于存储平均值??它的模式是bigint(20) id、varchar(20) string_id、datetime date_created、float average_value。
我想做的是--两个相对昂贵的查询:
我计划在一个批处理后端数据库上运行这些昂贵的查询,该数据库将其结果推送到实时前端DB服务器,该服务器处理来自用户的请求。这些查询将定期运行。我还没决定多久一次。一般的查询可以每天完成一次。去正常化查询需要更频繁--也许每隔几分钟就一次。
目前,这些查询在MySQL中的每一个查询都在一台非常低端的机器上运行几秒钟,其中的数据集在“大表”中有100 K记录。我既担心我的规模能力,也担心扩大规模的成本。
问题:
发布于 2012-08-28 23:11:00
您是否尝试过堆积更多的数据并对其进行基准测试?100 k行是无关紧要的。尝试2.5亿或500米,就像你期望的那样,你将需要处理,看看瓶颈在哪里。
一个RDBMS可以做很多事情,如果您仔细地注意到限制,并尝试和使用系统的优势。他们在某些事情上非常擅长,而在另一些事情上却很糟糕,所以你需要进行实验,以确保它是合适的。
对于某些批处理作业,您确实无法击败平面文件,将数据加载到RAM中,使用一系列循环和临时变量分解数据,并将结果转储出去。MySQL永远不可能,永远无法与这种速度相匹配,但如果适当调整和正确使用,它可以在一个数量级内。
您要做的是研究如何对数据进行分区。你是否有一套大的数据,有太多的交叉链接的方式来分割它,或者是否有天然的地方来划分它?如果可以对其进行分区,就不会有一个包含整堆行的表,但可能会有许多小得多的行。索引要小得多的表往往表现得更好。
从硬件的角度来看,您需要进行测试以查看平台的性能。有时候记忆是必不可少的。其他时候,它是磁盘I/O,这取决于您对数据所做的操作。您将需要密切关注您的CPU使用情况,并寻找高级别的IO,等待知道问题所在。
只要有可能,将数据拆分到多个系统中。如果您感觉勇敢,可以使用MySQL集群,或者简单地拆分许多独立的MySQL实例,其中每个实例使用一些有意义的分区方案存储完整数据集的任意部分。
发布于 2012-08-29 22:14:41
总表。
每天,为当天的数据计算汇总信息。把它放在“摘要”表中(S)。对他们进行询问。很容易达到10倍的速度。
如欲进一步讨论,请提供
一些明显的事情..。
“越小>越可缓存>越快。
发布于 2012-08-29 09:26:07
为了提供您的前端数据,除非始终有大量的插入,否则您确实无法击败使用触发器将其插入到与后端保持同步但经过优化以服务数据的物化视图中。当然,在这些触发器中,您需要将联接等保持在最低限度。我使用的一种策略是将这些插入/更新排队到中间表中,然后每隔一分钟左右发送一次。发送一个记录要比发送4GB的记录容易得多。4GB的数据流需要很长时间,即使您可以快速找到正在查找的记录。
我同意塔德曼的观点。最好的方法是在你想要的系统上用你期望的那种数据来分析它。
https://dba.stackexchange.com/questions/23328
复制相似问题