注意:可以在保持MySQL
或MSSQL
RDMBS的情况下回答此问题
背景
records
的表格。此表有20个字段,其中一些是VARCHAR(255)
。amount (FLOAT)
和status (INT)
的两个字段上运行报告。status
和amount
上编入索引。情况:
索引工作正常,即使有超过1000万条记录,基于这两个字段的分组响应时间也是可以接受的。 然而,随着数据的增长,索引的效率正在降低,因为RDBMS仍然需要解析所有这些数据子集,而不仅仅是解析这两个字段。即使使用正确的索引,这也会导致报告速度变慢。
问题:
尽管金额与记录具有一对一的关系,并且将金额和状态与记录ID外键放在一个单独的表中并没有多大意义但是,您是否认为即使它变得更有效率也是如此不太正常化?
为什么我会问这个问题?
因为对我来说这听起来很简单,如果我有一个包含记录ID和相应数量的单独表,那么当我运行一些关于数量和状态的报告时,它们将比当前设置快得多因为数据库有现在看看更少的数据和更少的数据必须通过数据总线等,并且在OS级别的数据不会解析计算报告所不需要的所有字段。我知道当我运行关于数量和状态的报告时,数据库将不关心存储在其中的其他字段和值,但是仍然必须读取所有这些数据子集以便解析记录并且仍然在磁盘级别结果为reads
。
答案 0 :(得分:1)
对数据库进行非规范化会为您提供非常好的性能(响应时间)增益,但您必须牺牲空间使用。
在你的情况下,我认为水平数据库Partitioning
可以在性能方面做一些提升。
散列 - 此分区模式允许DBA基于分离数据 在一个或多个表列上定义的计算散列键, 最终目标是平等的价值分配 分区。例如,DBA可以创建一个分区表 有十个基于表的主键的分区。
Key - 一种特殊形式的Hash,MySQL保证均匀 通过系统生成的哈希密钥分发数据。
列表 - 此分区模式允许DBA根据数据对数据进行分段 DBA指定的预定义值列表。例如,a DBA可以创建包含三个分区的分区表 基于2004年,2005年和2006年。