2013-07-05 26 views
1

注:这个问题可以回答保持MySQLMSSQL RDMBS记住的性能提升选择数据库非规范化的报告

背景:

  • 比方说你有一个名为records表。该表有20个字段,其中一些是VARCHAR(255)
  • 您必须在名为amount (FLOAT)status (INT)的两个字段上运行报告。
  • 由于一条记录只能有一个状态,所以它保存在同一个表中。
  • 表格索引在statusamount上。

现状:

索引好的工作,甚至有超过10万条记录的分组基于这两个领域是可以接受的响应时间。 然而,随着数据的增长,索引的效率正在降低,因为RDBMS仍然需要解析所有这些数据子集,而不仅仅解析这两个字段。即使使用适当的索引,这也会导致报告速度变慢和变慢。

问:

虽然量有一对一的关系与记录,它并没有真正意义投入量和状态在一个单独的表非常久远的记录ID外键,但是,你认为即使它变得不那么标准化,它会使它更有效率吗?

为什么我会问这个问题?

因为它听起来像是简单的逻辑,我认为,如果我有一个单独的表中包含一个记录ID和相应的金额,然后当我运行的量和状态的一些报告,然后他们会比当前设置因为快得多数据库现在需要查看更少的数据和更少量的数据必须通过数据总线等,并且所有那些不需要计算报告的字段都不会在操作系统级别解析数据。我知道当我运行一个关于数量和状态的报告时,数据库不会关心存储在其中的其他字段和值,但仍然必须读取所有这些数据子集才能解析记录,并且在磁盘级别仍然结果为reads

+1

你能否提供你正在运行一个报告查询和创建表输出的一个例子,我们可以看到当前的指标是什么样子? –

+0

在反规范化数据库之前,您可以尝试几件事情。 1)将固定长度的字段移动到行的前面,将你的变量移动到行的末尾。 2)只选择状态和金额,而不是整行。 –

+0

@GilbertLeBlanc谢谢,它非常有趣,知道如果这些可变长度字段移动到末尾很重要 –

回答

1

非规范化数据库为您提供了非常好的性能(响应时间)增益,但您必须考虑空间使用情况。

在你的情况下,我认为Partitioning水平数据库可以做一些增加的性能。

  1. 范围 - 此分区模式允许DBA指定为其分配数据的各种 范围。例如,DBA可能会创建一个分区表,该分区表由三个分区组成,这些分区包含1980年代,1990年代的 数据以及2000年以后的所有数据,包括 年。
  2. 散列 - 此分割模式允许DBA基于 ,其上的一个或多个表列, 与最终目标是值 分区之间均等分配所限定的计算出的散列密钥数据分离。例如,DBA可以创建一个分区表,其中 包含十个基于表的主键的分区。

  3. 密钥 - 一种特殊的哈希形式,其中MySQL通过系统生成的哈希密钥保证数据的分配甚至是 。

  4. 列表 - 此分区模式允许DBA根据DBA指定的值的预定义列表来分段数据。例如, DBA可以创建包含基于多年的2004年,2005年三个分区 分区表,和2006年

  5. 复合 - 这最后的分区模式允许DBA执行 子分区,其中一个表最初由 示例范围分区进行分区,但是随后通过另一种方法(例如,散列)将每个分区进一步分割为 。

taken from mysql dev