1

注意:MySQL可以在记住或MSSQLRDMBS 的情况下回答这个问题

背景:

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

情况:

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

问题:

尽管数量与记录具有一对一的关系,并且将数量和状态与记录 id 外键一起放在单独的表中并没有真正意义,但是,即使它变得不那么规范化,您认为这会提高效率吗?

我为什么要问这个问题?

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

4

1 回答 1

1

非规范化数据库可以让您获得非常好的性能(响应时间)增益,但您必须牺牲空间使用。

在您的情况下,我认为Partitioning横向数据库可以提高性能。

  1. 范围——这种分区模式允许 DBA 指定分配数据的各种范围。例如,DBA 可能会创建一个分区表,该表由三个分区分段,其中包含 1980 年代、1990 年代以及 2000 年以后(包括 2000 年)的所有数据。
  2. 散列 - 这种分区模式允许 DBA 根据一个或多个表列上定义的计算散列键来分离数据,最终目标是在分区之间平均分配值。例如,DBA 可以创建一个分区表,该表具有十个基于表主键的分区。

  3. Key – 一种特殊形式的 Hash,MySQL 通过系统生成的 hash key 保证数据的均匀分布。

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

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

取自 mysql dev

于 2013-07-05T05:44:27.983 回答