如何通过一个非常大的数据库获得高性能

时间:2010-08-04 13:09:24

标签: sql-server performance facebook join

我总是想知道像facebook这样一个非常大的网站怎么能比其他网站更快,尽管每天存储的数据量非常大...... 他们用来存储信息的内容,以及我使用sql server来存储例如news feed是正常还是什么(新闻Feed将存储在名为News的单独表格中)。
另一方面,如果我加入了许多巨大的桌子会发生什么 - 它应该很慢(也许)或者桌子有多大并不重要!?

thanx:)

4 个答案:

答案 0 :(得分:2)

当你谈到Facebook大小的缩放时,是一个完全不同的球场。最新估计,Facebook数据中心大约为60000 servers(六万)。估计只有缓存大约为30 TB(兆兆字节),而且只有Memcached cluster。虽然他们的后端是stil MySQL,但是作为一个纯粹的键值存储,根据公开available information

  
      
  • Facebook使用MySQL,但是   主要作为键值持久性   存储,移动连接和逻辑到   自优化以来的Web服务器   在那里更容易执行(在   Memcached层的“另一面”。)
  •   

在那里使用了各种其他技术:

您还可以观看今年的SIGMOD 2010密钥地址Building Facebook: Performance at big scale。他们甚至展示了他们的基本内部API:

cache_get ($ids,
    'cache_function',
    $cache_params,
    'db_function',
    $db_params);

因此,如果您连接点,您将看到如此规模,您不再谈论'大数据库'。您谈论的是庞大的服务集群,跨数千台服务器划分的键值存储,许多技术一起使用等等。

作为旁注,您还可以看到MySpace internals的精彩演示。尽管技术堆栈完全不同(基于Microsoft .Net和SQL Server,并且非常强调通过Service Broker传递消息),但它们在存储方式上的处理方式也有类似之处。总结:应用程序层分区

答案 1 :(得分:1)

这取决于,Facebook非常快,因为它们有一个服务器场,因此查询得到优化,每个查询都会遇到许多服务器。

对于大型表,只要您有足够的物理内存来索引您需要搜索的内容,它们就可以很快。拥有正确的索引可以极大地提高数据库性能(当涉及到检索数据时)。

只要将许多巨大的表连接成一个是有意义的,那么是的,但是如果它们是分开的,那么就没有相关性。如果您提供有关您希望合并的表格类型的更多详细信息,我们可能会为您提供更多帮助。

答案 2 :(得分:1)

根据link text和其他页面,Facebook使用了一种名为Sharding的技术。

它只是在每个数据库上使用一堆数据库和一小部分站点。决定使用哪个数据库的简单算法可以使用用户名中的第一个字母作为数据库的索引。一个用于'a'的数据库,一个用于'b'的数据库等。我确信Facebook有比这更先进的方案,但原理是相同的。

结果是许多小型独立数据库足够小以处理负载。 Facebook和所有其他主要网站都有各种类似的技巧,使网站快速响应。

他们不断监控网站的性能和其他指标,并针对发现的问题提出解决方案。

我认为监控部分对性能成功比实现获得性能的技术更重要。你不能通过盲目地抛出一些“好的表现法术”来建立一个快速的网站。在删除之前,您必须知道瓶颈的位置和原因。

答案 3 :(得分:0)

取决于性能瓶颈。一个问题通常是针对问题使用错误的技术,例如,当对象DB或文档存储更好时使用关系数据库,或者当然反之亦然。

有些人尝试使用相同的数据库来处理所有并不总是答案的数据库。有时,为了不同的目的对同一数据进行多次非规范化是很有用的。

考虑数据的性质以及如何编写,读取,查询等非常重要。您可以将所有一次写入数据放在一个数据库中,并为此优化该数据库。经常写入的其他数据可以存储在为此优化的数据库中。

分发技术也可以帮助扩展。