这只是一个关于海量数据库设计的设计问题。例如,如果您要构建一个可容纳1000万用户的数据库,您将如何构建它?
我的主要好奇心是像数据库复制这样的东西,这真的可以加速任何东西吗?
在构建这种大小的数据库时,假设字段是“用户名”、“姓名”、“公司”、“道布”、“性别”,除了创建一个表之外,还应该考虑什么?索引?
发布于 2011-07-21 22:45:00
1000万并不是特别大,但它足够大了,你应该仔细考虑你的选择。
复制可以提供很多帮助。假设您读取users表的次数比写入的次数多得多,那么您可以考虑使用只处理写入的master数据库。你的应用程序所做的任何读取都将来自N个从属盒子中的一个。
当然,索引非常重要。您需要在任何经常被搜索的列上建立索引(无论是在WHERE子句中,还是作为与其他表的关系的结果(read: JOINS))。关于如何分析您的应用程序发出的查询的种类,以及如何基于该分析巧妙地定义索引,已经写了很多文章。如果你刚刚学到这些东西,那就去读一些书,然后带着更有针对性的问题回来。
除了单主机复制(和仔细的索引)之外,当您开始变得非常庞大时,您可能会开始考虑partitioning --但这是我只读过的内容,所以我不想说太多。
发布于 2011-07-21 22:44:54
一千万条记录不一定是一个大数据库。有些人会考虑大型数据库,它由数亿行或更多行和of或of的存储组成。
除了典型的规范化之外,如果不能做任何事情来减少表的深度(行数),那么索引肯定会有帮助。
发布于 2011-07-21 22:45:08
一如既往,这取决于用例。您将在数据库上运行哪些查询?
有些应用程序只按用户名或uid检索用户,因为键值存储是完美的,并且具有无限的可扩展性。
如果您有其他的搜索查询,那么您可以将数据放入SQL (在适当的列上有索引),或者使用外部search 全文搜索引擎(lucene,sphinx)。您还可以在不同的副本上构建不同的索引,这样每个副本都可以用于特定的查询,但仍然可以获得良好的插入性能(当然不是针对用户表,而是针对与用户相关的数据)。
如果您有复杂的查询,连接多个表,那么SQL可能是唯一的选择,但您仍然可以在用户名和用户相关数据上使用分片进行扩展。同样,这取决于查询是什么。对于离线查询(统计数据、报告),您可以在每个分片上进行连接并合并结果集(map-reduce,gearman框架可以在这里提供帮助)。
最后,您可以混合所有这些方法,使用key-value进行登录,使用SQL进行复杂查询,并使用复制来实现持久性和性能。
https://stackoverflow.com/questions/6777708
复制相似问题