冗余数据与多表查询的选择

数据冗余与多表查询的选择

最近在家闲得无聊,和一个前端小伙伴联手在开发一个博客网站,遇到了一个mysql上的性能优化问题,在数据处理上,联表查询以及数据冗余操作,应该如何取舍,这个就涉及到了数据库的范式以及反范式

问题描述

获取博客文章评论的时候,需要同时获取评论者的昵称以及头像图片链接,那么这个时候是启用多表查询呢,还是采用数据冗余呢,可能会有人想都不想直接联表查询吧,也可能会有人说数据冗余,空间换时间

分析

但我们遇到这种问题的时候,需要好好考虑一下可能会产生的其他问题

当我们遇到我现在这种评论的情况的时候,采用数据冗余的方法是不可取的,首先我们先分析一下连表查询的性能

# 建表语句
CREATE TABLE `comment` (
  `id` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `article_id` int(11) NOT NULL,
  `detail` varchar(100) NOT NULL,
  `publish_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `article_user_id` (`article_id`,`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

在这里插入图片描述

从多表查询语句的分析中,我们可以看到,第一遍查询(及获取某篇文章的评论),采用了索引查询,第二次查询(获取用户信息),则是根据主键查询。其实这样的多表查询,性能其实不弱

数据冗余

如果我们采用数据冗余的方式,在每个评论后面保存评论者的昵称以及头像链接,这样的话我们在查询的时候,可以节省了第二次查询的时间,但是造成了空间的浪费,这还不是最主要的,想象一下,当用户修改昵称或者用户名的时候,需要从评论表里面获取自己的每一条评论并且修改,这样的性能极低。

那么什么时候才能采用数据冗余呢

当关联的数据极少变动且数据量不大时,可以采用数据冗余,就像大学生的专业一样,如果采用联表查询的话,每次都要关联学生信息表和专业信息表,当但我们只需要简单查询学生及其专业的时候,都要去联表查询,大数据量大的时候,就会造成性能下降,如果这个时候采用数据冗余,将专业名称冗余到学生信息中的时候,牺牲一点空间,来换取查询性能的极大提升

发布了17 篇原创文章 · 获赞 1 · 访问量 645

猜你喜欢

转载自blog.csdn.net/c_c_y_CC/article/details/104675707