2012-01-04 57 views
0

我很痛苦地意识到这可能不是一个神奇的子弹,但它正在成为一个问题。每个用户在3个表格中都有成千上万的指标数据行,这是逐秒更新的。从大型MySQL数据库获取顶线指标FAST?

当用户登录时,我想快速为他们的一些资产(即他们拥有顶级统计信息的navi中的每个资产旁边的顶级行状态)提供顶级行状态。

我试过了一些想法;但请 - 如果有人在这方面有一些建议或经验,那会很棒。东西尝试或目前为止: -

  • 每小时产生静态版本的顶线统计 - 这是所有用户和所有资产密集型。那么如何定期完成这项工作,我不确定。
  • 通过AJAX调用统计信息,以便页面加载后可以处理和填写它们(获取顶级统计信息现在可能需要最多10秒才能加载更大的用户)。这也可以缓存会话中的统计信息以保存每页加载的重做查询。
  • 查询以30分钟的间隔运行,即您登录,它将进行查询,然后在每次加载时(只有1/2秒)有希望使用查询缓存,直到下一个30分钟的时间间隔。

第一个似乎有最多的腿,但我不知道如何做到这一点,因为只有少数用户会需要这些统计信息 - 这似乎是非常昂贵的做所有人都时间。

+0

数十万行不是那么多。几百万并不是那么多。这听起来像是需要在数据库级别进行优化的情况。你使用什么硬件来运行你的MySQL实例,你使用的是什么数据库引擎(MyISAM,InnoDB或其他),我们正在讨论的确切的行数是多少,你添加到你的多少记录/秒分贝和有多少人正在使用你的分贝阅读? – 2012-01-04 11:16:29

+0

用户可以随时访问多个“其他用户”项目,因此这是额外查询级别的来源......将3个表连接在一起。我在一个小型的RDS实例上运行MyISAM(没有其他任何东西,这是一个实时大型实例的重复。) – waxical 2012-01-04 11:18:25

+2

是的,我有一个使用MyISAM的预感。对于某些目的来说,速度要快得多InnoDB的好处之一是它试图将整个工作数据集存储在RAM中(由innodb_buffer_poool MySQL变量控制)另外一个原因是InnoDB试图将数据保存在磁盘中与MyISAM不同的方式,所以顺序读取速度更快,这可能是一个交换存储引擎和增加内存缓冲区的想法,2个演出就足够了。 – 2012-01-04 11:21:46

回答

2
  1. 每小时左右产生顶线统计的静态版本 - 这是所有用户和所有资产密集型的 。那么如何定期完成
    ,我不确定。
  2. 通过AJAX调用统计信息,以便在加载页面后对其进行处理并填写(现在获得 顶级统计信息最多可能需要10秒才能加载更大的 用户)。这也可以将会话中的统计数据缓存到 保存重做每页加载查询。
  3. 查询以30分钟的间隔运行,即您登录,它将进行查询,然后 有望在每次加载时使用查询缓存(只有1/2 秒),直到下一个30分钟的时间间隔。

你在mysql选项,1和3是被称为materialized view的MySQL目前不支持他们,但这个概念就可以完成链路提供了范例

的记录几十万不算多。良好的指数和analytic queries的使用会让你相当远。可悲的是,这个概念并没有完全实施,但有解决方法以及提供的链接。

这确实取决于顶线统计。你是否希望实时数据降至第二位或者10-20甚至30分钟的时间间隔是否可以接受?使用event scheduler可以更快地查询包含汇总数据的报告表的创建/更新。这些数据可以在几分钟的交货时间内完成,因为所有繁重的工作都已经完成。然后,您的重点可以放在索引这些表以提高性能,而不必担心对生产表的影响。

+0

事件调度程序在我读取数据时需要花费时间,因此我需要获取并插入'新数据',因此请选择14,000个交互行并将其放入新行中为14000.这需要MySQL的时间来处理每个用户,我担心这个盒子会每天都这样做,并耗尽资源。 – waxical 2012-01-04 11:37:39

+1

不知道这种繁重的举动,这可能是你做得很好的事情。在大多数情况下,我在某些分析函数(卷起)中使用mySQL尝试提高了性能。每个查询/报告都需要根据逐个案例进行评估,试图用OPTIMAL设计和执行计划实施SQL。正如你所指出的,没有银弹。 – xQbert 2012-01-04 11:53:13

0

您正在使用您的设置进入datawarehousing域。这意味着,并非所有的NF1规则都适用。所以我的方法是使用触发器来填充单独的统计表。