【问题标题】:Database Joins Done On The Webserver在 Web 服务器上完成数据库连接
【发布时间】:2011-12-02 21:48:01
【问题描述】:
今天我发现an article online 正在讨论 Facebook 的架构(虽然有点过时了)。在阅读它时,我注意到在有助于 Facebook 扩展的软件部分下,第三个要点指出:
Facebook 使用 MySQL,但主要用作键值持久存储,
将连接和逻辑移动到 Web 服务器上,因为优化是
在那里更容易执行(在 Memcached 层的“另一边”)。
为什么要将复杂的连接移动到 Web 服务器?数据库不是为执行连接逻辑而优化的吗?这种方法似乎与我到目前为止所学到的相反,所以也许解释只是在逃避我。
如果可能的话,有人能解释一下吗(举个例子会有很大帮助)或者指点我一篇(或两篇)好文章来说明你如何以及为什么要这样做的好处(可能还有例子)?
【问题讨论】:
标签:
database
performance
join
webserver
theory
【解决方案1】:
我不确定 Facebook,但我们有几个应用程序遵循类似的模型。基础相当简单。
数据库包含大量数据。在数据库级别执行连接确实会减慢我们对数据进行的任何查询,即使我们只返回一个小子集。 (比如说100行父数据,以父子关系为例1000行子数据)
但是,使用 .NET DataSet 对象,我们在需要的行中进行选择,然后在 DataSet 中创建 DataRelation 对象,我们看到了性能的显着提升。
我无法回答为什么会这样,因为我对两者的内部运作都不了解,但我可以大胆猜测......
RDBMS(在我们的例子中是 Sql Server)必须处理文件中的数据。这些文件非常大,只能将其中的一部分加载到内存中,即使在我们重量级的 SQL Server 上也是如此,因此存在磁盘 I/O 的损失。
当我们将其中的一小部分加载到数据集中时,连接完全在内存中进行,因此我们失去了访问磁盘的 I/O 损失。
尽管我无法完全解释性能提升的原因(如果我的猜测是正确的,我希望有更多知识渊博的人告诉我)我可以告诉你,在某些情况下,当有一个 VERY大量数据,但您的应用程序只需要提取其中的一小部分,通过遵循所描述的模型可以显着提高性能。我们已经看到它将刚刚爬入的应用程序变成了闪电般快速的应用程序。
但如果操作不当,就会受到惩罚 - 如果您使机器的 RAM 过载但操作不当或在任何情况下都执行不当,那么您也会遇到崩溃或性能问题。