我有一个大数据库的标准化数据,变得非常缓慢,以查询报告。许多的查询,我在报告中加入五个或六个表,并具有审查几十或几百万。

有很多询问和最优化了尽可能降低服务器的负荷和增加的速度。我想是时候开始保持一个复制的数据在一个非标准化的格式。

任何想法在一个方法吗?我应该开始与一对夫妇的我最糟糕的查询,并从那里走?

有帮助吗?

解决方案

我知道更多关于mssql mysql,但我不认为的联接的数量或数量的行你说的是应该引起你过多的问题,正确的索引。你有没有查询进行分析的计划,看看如果你丢失吗?

http://dev.mysql.com/doc/refman/5.0/en/explain.html

这就是说,一旦你satisifed有你的指标和已经用尽了所有其他渠道德规范化可能是正确的答案。如果你只有一个或两个查询的问题、手动方法可能是合适的,而有些类型的数据仓库的工具,可以更好地为创建一个平台,用于开发数据方块。

这里有一个网站,我发现,涉及的主题:

http://www.meansandends.com/mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D

这里有一个简单的技术,可以使用,以保持将简单的查询,如果你只是做了几个时间(而且我不替你只读表格,只要创建一个新的用于报告目的)。让我们说你有这样的查询,在你的申请:

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

你可以创建一个非标准化的表格和填充几乎相同的查询:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

注意到强调了匹配表使用的别名

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

然后来修复您的应用程序使用新的非标准化的表格,切换点为下划线。

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

为巨大的查询,这样可以节省大量的时间和明确数据的来源,并且可以重新使用的查询,你已经有了。

记得,我只是倡导这种作为最后的手段。我敢打赌,有几个索引帮助你。当你去恢复正常,不要忘记帐户的额外空间的磁盘上,并弄清楚的时候你会运行查询以填充新的表格。这也许应该在晚上,或只要的活动是较低的。而该表中的数据,当然,永远不会完全是最新的。

[又一个编辑]不要忘记,新的表格创建需要编制索引的!好的部分是可以引到你的心内容,而不是担心更新的锁竞争,因为除了你的大容量插入本表只会看到的选择。

其他提示

MySQL5并支持 的风景,这可能有助于这种情况。听起来好像你已经做了大量的优化,但如果没有你可以使用MySQL 解释 语法看到什么指数是实际上被使用的,什么是放慢你的查询。

尽可能让有关标准化的数据(是否正在使用视,或只是重复的数据在一个更有效的方式),我认为起始与最慢的查询和工作的方式通过是一个很好的方法采取。

我知道这是一个切向位,但是你有没有试着看到,如果有更多的索引可以补充的吗?

我没有很多的数据库的背景,但我的工作与数据库有很多最近,我们已经发现了很多的查询,可以提高刚加入索引。

我们正在使用DB2,并没有命令被称为db2expln和db2advis,第一次将表明是否表扫描vs索引扫描正在使用,和第二会建议的索引可以加以改善性能。我敢肯定MySQL具有类似工具...

不管怎么说,如果这是你的东西没有考虑到的是,它已经帮助很多我...但如果你已经走了这条路,然后我猜这不是你所寻找的。

另一种可能性是一个"具体化的看法"(或者因为他们叫它在DB2),其中,您可以指定一个表,基本上是建成的部分从多个表格。因此,不是标准化的实际列,可以提供这种查访问的数据...但我不知道如果这个具有严重性能的影响插入/更新/删除(但如果是"具体化",那么它应该帮助选择,因为价值观是实物储存分开).

在符合一些其他意见,我肯定会看看你的索引。

有一件事我发现今年早些时候在我们的MySQL数据库,是权力的复合指数。例如,如果你正在报告的顺序编号通过日期范围内,一个复合指数上的序号和秩序的日期列可能的帮助。我相信MySQL只能使用一个指数,用于查询所以如果你只要有单独的索引了数量和秩序的日期将决定只有一个他们中的使用。使用解释命令可以帮助确定这一点。

得到指示性能良好的指数(包括无数的复合指数),我可以运行查询,加入3个表格在我们的数据库,并得到几乎即时的成果在大多数情况下。对更多的复杂报告的大多数运行查询在10秒钟。这些表3有33万,110万和140数以百万计的行分别。注意,我们也已经正规化,这些稍微加快我们的最常见的查询数据库。

更多的信息,关于您的表格和类型的报告查询可允许进一步的建议。

MySQL我喜欢这种谈话: 真实的世界网络:性能和可伸缩性,MySQL版.这包含很多不同的建议得到更快的速度推MySQL.

你可能还需要考虑选择成临时表,然后进行查询,临时表格。这将避免需要重新加入你的表格为每一个个单一的查询问题(假定可以使用的临时表对于许多询问,当然)。这基本上为您提供了规范化数据,但是如果你只是在做选择的电话,没有关注的有关数据的一致性。

继我先前的答案,另一个办法我们已经采取了在某些情况下是储存关键的报告中的数据单独的摘要表。有一些报告,查询它们只会缓慢甚至后denormalising和优化和我们发现,创造一个表,并储存在运行的总计或汇总信息在整个月因为它在结束的月份报告的要快得多。

我们找到这种办法易于实施,因为它没破坏任何东西已经工作-这只是额外的数据库插入在某些要点。

我一直在玩弄复合指数和已经看到一些真正的好处...也许我会设置一些测试看看,可以节省我在这里..至少一点时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top