Database 反规范化以何种方式提高数据库性能?
我听说了很多关于非规范化的事情,这是为了提高某些应用程序的性能。但我从未尝试过做任何相关的事情 所以,我只是好奇,规范化数据库中的哪些地方会使性能变差,或者换句话说,什么是非规范化原则Database 反规范化以何种方式提高数据库性能?,database,performance,database-design,normalization,denormalization,Database,Performance,Database Design,Normalization,Denormalization,我听说了很多关于非规范化的事情,这是为了提高某些应用程序的性能。但我从未尝试过做任何相关的事情 所以,我只是好奇,规范化数据库中的哪些地方会使性能变差,或者换句话说,什么是非规范化原则 如果需要提高性能,如何使用此技术 反规范化通常用于: 避免一定数量的查询 删除一些连接 反规范化的基本思想是添加冗余数据,或将一些数据分组,以便能够以较小的成本更轻松地获取这些数据;哪个更适合表演 一个简单的例子 考虑一个博客的“Posts”和“Comments”表 对于每个帖子,“评论”表中都有几行
如果需要提高性能,如何使用此技术 反规范化通常用于:
- 避免一定数量的查询
- 删除一些连接
一个简单的例子
- 考虑一个博客的“Posts”和“Comments”表
- 对于每个帖子,“评论”表中都有几行
- 这意味着要显示包含相关评论数的帖子列表,您必须:
- 执行一个查询以列出帖子
- 对每篇文章进行一次查询,以计算其评论数量(是的,这些评论可以合并为一个评论,以便一次获得所有文章的评论数量)
- 这意味着有几个问题
- 现在,如果在Posts表中添加“评论数”字段:
- 您只需要一个查询即可列出帖子
- 并且不需要查询Comments表:注释的数量已经非标准化为Posts表
- 只有一个查询返回一个或多个字段比多个查询更好
- 首先,这会在磁盘和内存中占用一些空间,因为您有一些冗余信息:
- 注释数存储在Posts表中
- 你也可以在评论表中找到这些数字
- 其次,每次有人添加/删除评论时,您必须:
- 当然,保存/删除评论
- 同时,更新Posts表中的相应编号
- 但是,如果你的博客上阅读的人比写评论的人多得多,这可能不是那么糟糕
- 非规范化视图
- 预计算列
- 引入某些数据复制以保存一些联接(例如,将某些信息填入一个表中,并对复制的数据表示满意,这样就不需要通过联接另一个表来查找该表中的所有数据)
- 您可以预先计算某些值并将它们存储在表列中,而不是每次查询数据库时都动态计算它们。当然,随着时间的推移,这些计算值可能会变得“过时”,您可能需要在某个时间点重新计算它们,但仅读取固定值通常比计算某些内容(例如,计算子行)更便宜
- 非规范化是一种时空权衡。规范化数据占用更少的空间,但可能需要连接来构造所需的结果集,因此需要更多的时间。如果它是非规范化的,数据将在多个地方复制。这样会占用更多空间,但所需的数据视图随时可用
还有其他时空优化,例如
与上述任何一种方法一样,这提高了读取数据的效率(因为数据随时可用),但更新数据的成本更高(因为需要更新复制或预计算的数据)。请考虑具有适当规范化父子关系的数据库 假设基数是2x1的平均值 您有两个表,父表,有p行。具有2xp行的子级 联接操作意味着对于p个父行,必须读取2xp个子行。读取的总行数为p+2xp 考虑将其反规范化为一个只有子行的表,2xp。读取的行数是2xp
更少的行==更少的物理I/O==更快。如果您有某些要求,如报告等,它可以通过各种方式帮助您的数据库反规范化: