对数据库新的认识之数据冗余
今天记录一次公司的技术分享,让我明白了,原来数据冗余也是一个利器。
数据库范式
在上学学习数据库的时候肯定都是要讲到范式的,这里简单回顾一下。
-第一范式(1NF)
所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项,即没有重复域。
-第二范式(2NF)
在满足第一范式的基础上,要求数据库表中的每个实例或记录必须可以被唯一地区分。
-第三范式(3NF)
在满足第二范式的基础上,任何非主属性不依赖于其它非主属性。
一定的冗余可以提升性能
冗余是指在一个数据集合中重复的数据称为数据冗余。
1.空间换时间
有一张字典表 city 其中有 id 和 cityName 两个字段,有一张业务表,其中有 id 、cityId、XXX、XXX…字段。
如果查询业务表的话,就必须 join 一下 city 字典表,如果业务表很大很大,那么就会查询的很慢,这个时候我们就可以使用冗余来解决这个问题,直接将业务表中的 cityId 更换成 cityName,这样我们在查询业务表的时候就不需要去 join 那一张 city 的字典表了。这样的方式显然是不符合我们数据库设计的范式的,但是这样的冗余或许很有必要。
2.查询某一个状态值数据
业务表中有一个字段 status 用来存储提交和未提交,假设这张表中未提交的数据相对于提交的数据是很少的,当用户查询所有未提交的数据的时候,就需要在全部的数据,然后筛选出未同意的数据。如果这张业务表非常的庞大,那么这样的查询的效率就非常的慢。
这个时候我们就可以把这张业务表中的未同意的数据冗余到一张新表中,这样用户查询未提交的数据的时候就可以直接在这张未提交的表中查询,查询速度提交很多。
3.拆分活跃数据和不活跃数据
某业务表有这样的一个特点,用户往往都在查询最近三个月(或几个月的)数据,数据每天都在增长,由于数据库表的增长,查询变得原来越慢,性能遇到瓶颈。这个时候可以根据业务将这张表拆分成三个月内数据和三个月外数据,其中三个月外数据还可以按照年份(或月份或季度)拆分成不同的分片。这样用户的查询会大量的命中与三个月内的那张表中,而这张表的数据是有限的,并且数据量并不会特别大,从而解决性能的瓶颈。
4.汇总数据单独存放
某业务表存放着每天的交易数据,用户有的时候想查看某个季度,某一年份的交易总额。几个用户还好,当用户量增加,查询数增加,那么实时查询的方法已经满足不了要求,这个时候我们可以将这一类的汇总数据单独的存放到一张表中,通过在夜间用户量较少的时候计算出来,当用户再次查询的时候我们直接显示这张汇总表中的数据,而不通过查询交易数据表实时计算,这样可以大量的提高性能。
相关文章
- 查询mysql的隔离级别_怎么查看数据库隔离级别
- 【说站】Python操作PgSQL数据库的方法
- java读取数据库_jsp怎么显示数据库数据
- greenplum 5.7 + connection master segment详解数据库
- 恢复mssql数据库:解决数据丢失的最佳方法(还原mssql数据库)
- Mysql查看数据库表中的大小:实现方法(mysql查看数据大小)
- Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性详解编程语言
- Oracle压力测试工具:测试你的数据库性能(oracle压力测试工具)
- 备份21分钟快速MySQL数据库备份(21分钟mysql)
- 实践MySQL数据库优化实践(mysql数据优化)
- MySQL去重复函数:轻松实现数据库中数据去重(mysql去重复函数)
- 综述Oracle数据库中精准与高效的数据存取(oracle数据库论文)
- Oracle数据库对比工具:快速对比、精准查找(oracle数据对比工具)
- Oracle数据库实现快速插入操作(oracle带插入)
- Oracle数据库实现全文搜索(oracle全文搜索)
- 利用MSSQL数据库实现数据复制(mssql数据库复制)
- 速度MySQL数据库优化:提升写入速度(mysql数据库写入)
- 极大提升效率:Redis 助力数据库缓存(数据库缓存redis)
- 开源分布式数据库能否支撑银行海量非结构化数据应用?
- 下载Oracle 10——满足企业数据需求的首选数据库(oracle10下载)
- 架起数据云梦:搭建MSSQL云数据库(搭建云数据库mssql)
- 库管理Mssql管理百万级数据库:实现高效率运营(Mssql百万级数据)
- C语言调用Oracle数据库快速实现操作指令(c 调用oracle包体)
- C语言编程实现Oracle数据库登录(c 登录oracle)
- 5717版MySQL持续改进数据库管理体验(5.7.17 MySQL)
- 实时同步数据库更新完毕,Redis已准备就绪(数据库更新通知redis)
- Oracle数据库编码自动递增实现方法(oracle中编号自增长)
- 实战Oracle例子数据库实操指南(oracle例子数据库)
- Oracle中使用正则表达式实现数据库全文检索(oracle中正则查找)
- 从Oracle数据库中只提取正数(oracle中只选取正数)
- 库一步到位Oracle数据库下载指南(oracle 下载数据)
- Java使用poi把数据库中数据导入Excel的解决方法