2011-12-22 39 views
3

我正在寻找处理MySQL中大表的选项。在我的数据库中,几乎没有超过1.3亿行(超过70GB)的表增长非常快。为了报告和分析目的,我必须运行一些聚合函数,尽管有索引,查询运行速度非常慢。我试图用合并数据制作一些表格,但这不是最佳的。所以我正在寻找可以用来解决这个问题的工具。非常大的mysql表和报告

+0

什么方法/方法你用来整合你的数据吗? – Nonym 2011-12-23 02:13:33

+0

我运行了一些预聚合查询来填充汇总表 – user1078191 2011-12-23 13:51:33

+0

硬件,存储引擎,查询本身,索引 - 所有这些都会影响查询的速度。您可以运行'EXPLAIN SELECT'来查看MySQL的功能。 70演出是很多数据,但它可以始终进行优化(不同的存储引擎,规范化,分区) - 由于您没有发布进行分析所需的任何信息,因此很难指出问题并提出解决方案除了通常的解决方案 - 比如Nonym的答案。 – 2011-12-23 15:13:25

回答

3

开始通过寻找到partition荷兰国际集团的表,如果您尚未:

http://dev.mysql.com/doc/refman/5.1/en/partitioning.html

http://www.slideshare.net/datacharmer/mysql-partitions-tutorial

http://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html

你是如何 '整合' 你的数据吗?也许你使用的方法不是最优的。一种好的方法(让我知道这实际上是你在做什么)是创建一个包含聚合数据的表。然后将其设置是这样的:

首先抛开数据是如何被倾倒到主桌...

  • 创建任务(cron或任何你可以有方便的或已配置),其相对于如何将数据加载到主表中的指定时间间隔运行(我们称之为MAIN,前进)。如果您的MAIN表每小时加载一次,则将其同步。半小时?没关系。无论如何您都可以检查速度,或者您的报告运行时间接近非高峰时段,然后计划在

    以上
  • 正确地为您的表索引合并数据。我们称之为AGG

  • 创建一个将数据从MAIN加载到AGG的存储过程,该存储过程基本上是AGG LOAD FOR INTERVAL-?。当然,在这里你是唯一一个知道数据如何或何时插入MAIN的人,所以你也是知道聚集意图是什么的人。如果聚合意图未完成(也就是说它是一整天,所以它是一个累计运行,直到设置为止),也可以继续运行聚合存储过程。

  • 使用STAGING表。 对我来说,他们是最好的

  • 创建一个重新检查数据的存储过程,以便通过运行此过程可以在AGG表中反映任何更新或记录的其他插入操作。包含要更新的范围的参数。如果它是每天,那么你有一个DAILY AGG LOADDAILY AGG RELOAD程序。包括一个AGG CHECK INTERVALAGG CHECK DAILY程序,这将有助于你在晚上睡得好。哦,更不用提AGG DATA HOLE CHECKMISSING AGG DATA CHECK和应用实现检查数据所需要的最小量,你可以从汇总表或从主表或临时表(最好)

  • 当然获得业务规则,千万不要修改AGG表。始终只重新加载它。

  • 这有什么用?那么你不需要让你的报告查询AGG表,它更小,更快(因为聚合已经完成)?性能问题可能是在间隔加载时出现的,但是如果您正确地构建表,其索引和维护,它应该是值得的。

  • 分区进来了吗?存档。一旦某段时间过去了(讨论什么是你的团队/老板/顶级人物可以接受的),你可以从MAIN归档旧数据。我经历过不得不在生产数据库中保存一年的数据。这种感觉像是一种阻力,但因为这是客户的要求,所以公司别无选择,只能给我所需的磁盘空间(搓手),而男孩则一直陪伴着它,直到我得到一些体面的东西。我必须提到我的经验是使用Microsoft SQL Server 2005,存储过程和SSIS使它变得有趣。

这是所有如果你不知道它,并为其他人可能想考虑的选项。我并不是说你不知道上面的任何一个;我只是说明我以前能够做的事情 - 考虑到我没有更多的信息与你的帖子一起工作,除了你有一个合并过程,你尝试过..

+0

感谢您的建议。我已经尝试了很多次,可能不是这样的顺序。所以我应该从一个好的计划开始。 – user1078191 2011-12-23 15:27:40

+0

是的,我应该提到这一点。正确计划,预测并永远不要低估(就磁盘空间而言,估计会更好一些)您的要求.. – Nonym 2011-12-24 04:46:38