用于SELECT报告的性能增益的数据库非规范化

时间:2013-07-05 05:19:49

标签: mysql sql-server database performance

注意:可以在保持MySQLMSSQL RDMBS的情况下回答此问题

背景

  • 假设您有一张名为records的表格。此表有20个字段,其中一些是VARCHAR(255)
  • 您必须在名为amount (FLOAT)status (INT)的两个字段上运行报告。
  • 由于一条记录只能有一个状态,因此它保存在同一个表中。
  • 表格已在statusamount上编入索引。

情况:

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

问题:

尽管金额与记录具有一对一的关系,并且将金额和状态与记录ID外键放在一个单独的表中并没有多大意义但是,您是否认为即使它变得更有效率也是如此不太正常化?

为什么我会问这个问题?

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

1 个答案:

答案 0 :(得分:1)

对数据库进行非规范化会为您提供非常好的性能(响应时间)增益,但您必须牺牲空间使用。

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

  1. 范围 - 此分区模式允许DBA指定各种分区 分配数据的范围。例如,DBA可以创建一个 分区表,由包含的三个分区分段 1980年代,1990年代的数据以及超出和包括的所有内容 2000年。
  2. 散列 - 此分区模式允许DBA基于分离数据 在一个或多个表列上定义的计算散列键, 最终目标是平等的价值分配 分区。例如,DBA可以创建一个分区表 有十个基于表的主键的分区。

  3. Key - 一种特殊形式的Hash,MySQL保证均匀     通过系统生成的哈希密钥分发数据。

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

  5. 复合 - 此最终分区模式允许DBA执行             最初为表分区的子分区for             示例范围分区,但随后每个分区都被分段             更进一步的方法(例如,哈希)。
  6. taken from mysql dev