2012-07-17 58 views
2

我有一个MySQL表,用于存储具有> 2MM行和8列以及userID上的索引的用户统计信息。当用户访问他的个人资料时,会从数据库中检索出大量信息,最糟糕的情况是,几十个SELECT查询有时会与其他表格一起加入。它与SO上的配置文件类似,它也需要大量的数据。大表上的MySQL性能问题 - 如何有效地缓存结果?

一些想要获得用户分数的查询需要COUNT和其他性能,吃掉MySQL函数。所以只需查看配置文件页面可能需要10-20秒。

现在我的问题:

  1. 如何像这样一个网站,拉这么多的信息,迅速?
  2. 我需要一个缓存层吗?
  3. 我是否应该预先计算出消耗MySQL性能的分数等的计数值 ?
  4. 我应该使用一个 写入优化表和一个读取优化表吗?如果是这样,我可以如何检索SO上的实时数据?
  5. 我应该离开MySQL吗?

回答

2

如何像这样一个网站,拉这么多的信息,迅速?

他们给你拔“这么多的”数据幻觉,但在现实中,他们获得一次一个块。基本上,您需要一个查询来获得结果的COUNT,另一个查询可以获取该结果集中任何页面的数据。结果集不被缓存。查询的参数可以被缓存。但最好以每个页面请求提供查询参数的方式来实现。

我需要一个缓存层吗?

可能是。但没有必要执行此操作。缓存对于存储先前提取的页面可能很有用,并且整个社区使用相同的页面,而不是一个用户。

我应该预先计算消耗MySQL性能的分数等吗?

与此用例无关。

我应该使用一个写入优化表和一个读取优化表吗?如果是这样,我怎么能像SO上检索实时数据?

不需要。

我应该离开MySQL吗?

不需要。

有关此概念的更多详细信息,请查阅分页的Ajax网格

+0

这是一个很好的答案。总结一下,我应该减少查询的数量,并在需要时提取信息 - 因此基于事件。然而,问题是在像名人堂这样的一些页面上,我需要很多关于很多用户的信息。所以我不能轻易减少查询次数。那么下一步应该是什么? – Horen 2012-07-17 22:06:44

+0

对于有很多业务规则的密集查询,最好是定期离线计算这些视图,并将它们物化(临时表),并将它们用作快速访问数据。 缓存听起来很棒,实际上很容易实现,直到解决缓存失效的问题。数据背后的业务规则越多,执行失效就越困难。所以数据的周期性实现更容易实现。 – 2012-07-18 12:47:33

+0

所以你的意思是我应该创建临时表,只包含例如计算用户得分,因为计算需要大部分时间,临时表上的“select”会非常快,对吗? 有一个缺点,数据不会生活,只是不时计算 - 哪种吸引... – Horen 2012-07-18 16:22:57