对数据库新的认识之数据冗余

今天记录一次公司的技术分享,让我明白了,原来数据冗余也是一个利器。

数据库范式

在上学学习数据库的时候肯定都是要讲到范式的,这里简单回顾一下。
-第一范式(1NF)
所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项,即没有重复域。
-第二范式(2NF)
在满足第一范式的基础上,要求数据库表中的每个实例或记录必须可以被唯一地区分。
-第三范式(3NF)
在满足第二范式的基础上,任何非主属性不依赖于其它非主属性。

一定的冗余可以提升性能

冗余是指在一个数据集合中重复的数据称为数据冗余。

1.空间换时间

有一张字典表 city 其中有 id 和 cityName 两个字段,有一张业务表,其中有 id 、cityId、XXX、XXX…字段。
如果查询业务表的话,就必须 join 一下 city 字典表,如果业务表很大很大,那么就会查询的很慢,这个时候我们就可以使用冗余来解决这个问题,直接将业务表中的 cityId 更换成 cityName,这样我们在查询业务表的时候就不需要去 join 那一张 city 的字典表了。这样的方式显然是不符合我们数据库设计的范式的,但是这样的冗余或许很有必要。

2.查询某一个状态值数据

业务表中有一个字段 status 用来存储提交和未提交,假设这张表中未提交的数据相对于提交的数据是很少的,当用户查询所有未提交的数据的时候,就需要在全部的数据,然后筛选出未同意的数据。如果这张业务表非常的庞大,那么这样的查询的效率就非常的慢。
这个时候我们就可以把这张业务表中的未同意的数据冗余到一张新表中,这样用户查询未提交的数据的时候就可以直接在这张未提交的表中查询,查询速度提交很多。

3.拆分活跃数据和不活跃数据

某业务表有这样的一个特点,用户往往都在查询最近三个月(或几个月的)数据,数据每天都在增长,由于数据库表的增长,查询变得原来越慢,性能遇到瓶颈。这个时候可以根据业务将这张表拆分成三个月内数据和三个月外数据,其中三个月外数据还可以按照年份(或月份或季度)拆分成不同的分片。这样用户的查询会大量的命中与三个月内的那张表中,而这张表的数据是有限的,并且数据量并不会特别大,从而解决性能的瓶颈。

4.汇总数据单独存放

某业务表存放着每天的交易数据,用户有的时候想查看某个季度,某一年份的交易总额。几个用户还好,当用户量增加,查询数增加,那么实时查询的方法已经满足不了要求,这个时候我们可以将这一类的汇总数据单独的存放到一张表中,通过在夜间用户量较少的时候计算出来,当用户再次查询的时候我们直接显示这张汇总表中的数据,而不通过查询交易数据表实时计算,这样可以大量的提高性能。

时间: 2024-10-15 09:00:13

对数据库新的认识之数据冗余的相关文章

MySQL数据库新特性之存储过程入门教程

在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 .同时,存储过程可以接收和输出参数.返回执行存储过程的状态值,也可以嵌套调用. 存储过程的优点 作为存储过程,有以

Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页查询语法.offset和fetch 1 1.3. OVER子句的增强和新增一些分析函数. 之前OVER子句是用于RANK,ROW_NUMBER等排名函数,现在OVER子句得到了大大的增强, 可以将OVER子句应用到聚合函数中,也增加了一些分析函数. 2 1.4. 增强的审计功能 2 1.5. 增强的

移动端数据库新王者:realm

介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android. 2014年7月发布.由YCombinator孵化的创业团队历时几年打造,是第一个专门针对移动平台设计的数据库.目标是取代SQLite. 为了彻底解决性能问题,核心数据引擎C++打造,并不是建立在SQLite之上的ORM.如果对数据引擎实现想深入了解可以查看:Realm 核心数据库引擎探秘.因此得到的收益就是比普通的ORM要快很多,甚至比单独无封装的SQLite还要快. 因为

Python使用MySQL数据库(新)(转)

http://www.cnblogs.com/fnng/p/3565912.html 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的linux 仓库中都会有mysql ,我们只需要通过一个命令就可以下载安装: Ubuntu\deepin >>sudo apt-get install mysql-server >>Sudo apt-g

Python使用MySQL数据库(新)

之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 然而,2016年开始,我从Python2切换到了Python3,Python2已经基本不再使用,MySQLdb驱动从2014年1月停止了维护.所以,打算重新再来写这篇博客. Python2 ---> Python3 MySQLdb --> PyMySQL 一,安装PyMySQL Python是编程语言,MySQL是数据库,它们是两种不同的技术:要想使Pyth

如何准确高效的获取数据库新插入数据的主键id

例如我们新建了一张表UserInformation,字段如下Id,为主键,自增,其它字段Name,Pwd,Email 然后我们来执行一个新增插入操作: insert into UserInformation (Name,Pwd,Email) values('小明','123','111') 我们想在新增插入数据的时候获取到插入这条数据的主键的值是多少, 解决的方法有两种: 1.一种是直接输入某个字段,然后查询,代码如下: insert into UserInformation (Name,Pwd

SQL SERVER数据库新认识的一些基础知识

最近要接触sql server的存储过程啦,在处理更加复杂的逻辑过程前,就来看一下这些sql的基础语法,感觉看啦一些复杂一点的sql语句,突然发现我是有多么的薄弱啊,所以在一些基础的语法上面我再重新整理一些吧,下面就来认识几点吧. 一. sql server中如何理解:isnull(a,0) 和 isnull(a,0)<>0 的区别以及select into的用法 select top 2 name into #A from student where isnull(id,0)=0 and i

mysql数据库新安装无法启动

mysql数据库源码编译之后,启动失败具体报错日志如下: 2018-04-13 23:45:46 67547 [Note] Plugin 'FEDERATED' is disabled. /usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist 2018-04-13 23:45:46 67547 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrad

Docker For MYSQL 8.0 特别注意修复数据库新的验证方式

从Docker登录MySQL的终端 docker exec -it wordpress-mysql /bin/bash 登录数据库 mysql -u root -p 使用MYSQL数据库 use mysql 查询MYSQL的root用户情况 select host, user, plugin from user; 修改root用户插件验证方式 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxxxxxxxx';