我正在寻找处理MySQL中的大表的选项。在我的数据库中,有几个表超过1.3亿行(超过70GB)增长非常快。出于报告和分析的目的,我必须运行一些聚合函数,尽管有索引,但查询运行速度非常慢。我试图用合并数据制作一些表,但这不是最佳的。所以我正在寻找可以用来解决这个问题的工具选项。
答案 0 :(得分:3)
首先查看partition
你的桌子,如果你还没有:
http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
http://www.slideshare.net/datacharmer/mysql-partitions-tutorial
您如何'整合'您的数据?也许您使用的方法不是最佳的。一个好方法(让我知道这实际上是你在做什么)是创建一个包含聚合数据的表。然后以这种方式设置:
首先抛开数据如何被转储到主表中......
创建一个以指定的时间间隔运行的作业(cron或任何你可能已经配置或已配置的),相对于数据加载到主表的方式(让我们称之为MAIN
,移动)向前)。如果您的MAIN表每小时加载一次,那么请同步它。半小时?无所谓。您可以检查速度,或者是否接近报告运行的非高峰时段,然后安排在接近时间
正确索引表格以获取合并数据。我们称之为AGG
前进。
创建一个存储过程,将数据从MAIN加载到AGG,基本上是AGG LOAD FOR INTERVAL-?
。当然,你是这里唯一知道如何或何时将数据插入MAIN的人,因此你也将知道聚合意图是什么。如果聚合意图没有完成,也可以继续运行聚合存储过程(比如它是一整天..所以它是累积运行,直到设置完毕)
使用STAGING
表。 对我来说,他们是最好的。
创建一个重新检查数据的存储过程,以便通过运行此过程可以在AGG表中反映任何更新或其他记录插入。包括要更新的范围的参数。如果是每天,那么您有一个DAILY AGG LOAD
和DAILY AGG RELOAD
程序。包含AGG CHECK INTERVAL
和AGG CHECK DAILY
程序,可帮助您在晚上睡个好觉。哦,更不用说AGG DATA HOLE CHECK
或MISSING AGG DATA CHECK
并应用业务规则来实现检查所需的最小数据量,您可以从聚合表或主表或登台表中获取(最好)
当然,永远不要修改AGG
表。始终只重新加载。
这有什么用?那么您是否只需要让您的报告查询AGG
表,该表更小,更快(因为聚合已经完成)?也许性能问题来自于间隔加载,但是如果你正确地构建了你的表,它的索引和它的维护,它应该是值得的。
分区在哪里进来?存档。一旦某个时间过去(讨论您的团队/老板/顶级人员可接受的内容),您可以归档MAIN
中的旧数据。我经历过必须在生产数据库中保留1年的数据。这有点像拖累,但因为这是客户的要求,公司别无选择,只能给我所需的磁盘空间(摩擦手),男孩我一直玩它,直到我得到一些体面的运行。我必须提一下,我的经验是使用Microsoft SQL Server 2005,存储过程和SSIS使它变得有趣。
如果您还不知道,以及其他可能想要考虑选项的人,这就是全部。我不是说你不知道上面的任何一个;我只是说明我之前能做些什么 - 考虑到我没有更多信息可以从你的帖子中使用,除非你有一个你试过的整合过程..