database - 反规范化以何种方式提高数据库性能?

标签 database performance database-design normalization denormalization

我听说过很多关于非规范化的信息,它是为了提高某些应用程序的性能而设计的。但我从未尝试过做任何相关的事情。

所以,我很好奇,规范化数据库中的哪些位置会使性能变差,或者换句话说,反规范化原则是什么?

如果我需要提高性能,我该如何使用这种技术?

最佳答案

非规范化通常用于:

  • 避免一定数量的查询
  • 删除一些连接

非规范化的基本思想是,您将添加冗余数据或对一些数据进行分组,以便能够以更小的成本更轻松地获取这些数据;这对性能更好。


一个简单的例子?

  • 考虑一个博客的“帖子”和“评论”表
    • 对于每个帖子,您将在“评论”表中有几行
    • 这意味着要显示具有相关评论数量的帖子列表,您必须:
      • 执行一次查询以列出帖子
      • 对每个帖子执行一个查询以计算它有多少评论(是的,这些可以合并为一个,一次获得所有帖子的数量)
      • 这意味着多个查询。
  • 现在,如果您在 Posts 表中添加一个“评论数”字段:
    • 您只需要一个查询就可以列出帖子
    • 并且不需要查询 Comments 表:评论的数量已经反规范化到 Posts 表。
    • 而且只返回一个字段的查询比更多查询要好。

现在,有一些成本,是的:

  • 首先,这会在磁盘和内存中占用一些空间,因为您有一些冗余信息:
    • 评论数存储在Posts表中
    • 您还可以在评论表中找到这些数字
  • 其次,每次有人添加/删除评论时,您都必须:
    • 当然是保存/删除评论
    • 同时更新 Posts 表中的相应编号。
    • 但是,如果阅读您博客的人多于写评论的人,这可能还不错。

关于database - 反规范化以何种方式提高数据库性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2349270/

相关文章:

mysql - 连接查询的 if 条件

php - 存储定制/不同的用户数据

php - 基于动态配置文件的网站也有硬链接(hard link)?

mysql - 从电力读数mysql计算使用的千瓦时

java - EasyPHP 上的数据库服务器无法启动

mysql - Rails 应用程序中 mysql 查询性能缓慢

php - 多对多链接表的替代方案

sql - 获取给定 ID 的根节点和叶节点 - 如何?

mysql - 如何在数据库中实现这一点?

c# - 在 ItemsControl 中使用 GeometryDrawing