MySQL系列(三)--数据库结构优化
良好的数据库逻辑设计和物理设计是数据库高性能的基础,所以对于数据库结构优化是很有必要的
数据库结构优化目的:
1、减少数据的冗余
2、尽量避免在数据插入、删除和更新异常
例如:有一张设计不得当的学生选课表
- CREATE TABLE selectcourse(
- stu_no INT(11) NOT NULL COMMENT '学号',
- stu_name VARCHAR(10) NOT NULL COMMENT '学生姓名',
- birth_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '生日',
- course_name VARCHAR(10) NOT NULL COMMENT '课程名称',
- score INT(11) DEFAULT NULL COMMENT '成绩',
- course_point INT(11) NOT NULL COMMENT '学分',
- PRIMARY KEY(stu_no, course_name)
- ) ENGINE = INNODB DEFAULT CHARSET=utf8
查询结果:
- 1 sam 1994-06-22 16:19:39 数学 10
- 1 sam 2019-06-22 16:21:02 英语 9
- 2 jesen 1995-06-22 16:19:39 数学 10
- 2 jesen 1995-06-22 16:22:27 英语 9
插入异常:
如果表中某个实体依赖另一个实体而存在,想添加一门语文课,但是依赖学生、学号等
更新异常:
更新表中某个实体的单独属性时,需要对多行进行更新,如果把数学的学分进行更新,就需要更新多条数据
删除异常:
删除表中某个实体,导致其他实体也被删除,想要删除英文这门课,但是也会被选择语文课的学生信息也删除
3、解决数据库存储空间
4、提高查询效率
结构优化设计步骤:
1、需求分析:存储需求、数据处理需求、安全性要求等
2、逻辑设计:
1、设计数据的逻辑存储结构
2、数据实体之间的逻辑关系,解决数据冗余和数据存储异常
3、物理设计:
根据使用的数据库特点设计表结构
4、维护优化:
根据实际情况对索引、存储结构进行优化
数据库三范式:
第一范式:
数据库表中字段都是单一属性,不能再进行细化分解
第二范式:
表中只有一个业务主键,不能存在非主键列对主键存在部分依赖,如果主键是单一列肯定符合,但是如果是复合主键,就肯定可能
不满足这一要求。
例如上面的selectcourse表,主键:PRIMARY KEY (`stu_no`,`course_name`),学分只是依赖课程列,学生姓名只是依赖学号,
所以为了满足第二范式要求,需要对表进行拆分
拆分为:学生表、课程表、学生选课表
第三范式:
每个非主属性不能对业务主键存在依赖传递,消除了第二范式基础上非主键列对主键的传递依赖
例如,现在学生表里面存在着学院,学院电话等信息,学院电话通过学院与学生表产生传递依赖,我们需要再拆分成学员信息表
满足三范式,基本就解决了数据冗余和数据异常的问题,但是不是一定要满足,看实际需求的,有时候需要反范式设计
需求分析和逻辑设计实战:
设计出下面电商网站的数据库结构
需求:
1、只销售图书类商品
2、需要以下功能
1).用户登录
2).商品展示
3).供应商管理
4).用户管理
5).商品管理
6).在线销售
需求分析:
用户登录:
1、用户必须注册并登录系统才能进行交易
2、同一时间只能一个用户在一个地方登录
3、用户信息:{用户名(主键),密码,手机号,姓名,注册信息,在线状态,生日}
商品展示和管理功能:
商品信息:{商品名称,分类名称,出版社名称,图书价格,图书描述,作者}
但是这样设计不符合三范式,如果增加一个分类,但是没有商品,是无法添加的,所以需要表拆分
商品信息表:{商品名称,出版社名称,价格,描述,作者}
分类信息表:{分类名称,分类描述}
商品分类对应表:{商品名称、分类名称}
供应商管理:
供应商信息:{出版社名称,地址,电话,联系人,银行账户}
在线销售:
在线销售表:{订单编号,订单用户名,订单日期,订单金额,订单商品分类,订单商品名,订单商品单价,订单商品数量,支付金额,物流单号}
1、只有一个业务主键,符合第二范式
2、订单编号,订单商品数量,订单商品单价存在传递依赖关系,不符合第三范式
3、数据冗余:订单商品信息和商品信息表的数据
拆分:
订单表:{订单编号,订单用户名,订单日期,支付金额,物流单号}
订单商品关联表:{订单编号,订单商品分类,订单商品名,支付金额,商品数量}
现在查询一个用户订单总金额的SQL:
select 订单用户名,sum(d.商品价格*d.商品数量) from 订单表 a join 订单商品关联表 b on a.订单编号 = b.订单编号
join 商品分类关联表 c on c.商品名称 = b.商品名称 and c.分类名称 = b.订单商品分类
join 商品信息表 d on d.商品名称 = c.商品名称
group by 下单用户名
我们发现管理的表太多,会导致性能变得的很差
查询下单用户和订单详情:SQL也会关联的很复杂
总结:完全符合三范式,可能导致SQL查询性能变差,所以需要反范式化设计
反范式化:
为了性能和效率的考虑适当的违反范式化设计要求,允许存在少量的数据冗余,就是以空间换时间
对商品信息进行反范式化设计:
商品信息表:{商品名称,分类名称,出版社名称,价格,描述,作者}
分类信息表:{分类名称,分类描述}
现在查询一个用户订单总金额的SQL:
select 订单用户名,sum(订单金额) from 订单表 group by 下单用户名
订单表:{订单编号,订单用户名,手机号,订单日期,支付金额,物流单号,订单金额}
订单商品关联表:{订单编号,订单商品分类,订单商品名,商品单价,商品数量}
范式化设计和反范式化设计的对比:
1、范式化可以尽量的减少数据冗余
2、范式化的更新操作比反范式化更快
3、范式化的表通常比反范式化的表要小
4、反范式化减少表的关联
5、反范式化相比范式化可以更好的对索引进行优化,例如使用覆盖索引
物理设计:
1、定义数据库、表和字段的命名规范
命名蹲守可读性原则、表意性原则、长名原则,注意MySQL是区分大小写的
2、选择合适的存储引擎
3、为表中的字段设计合适的数据类型
参考我之前写过的一篇文章:MySQL系列(一)--数据类型
4、建立数据库表结构
MySQL系列(三)--数据库结构优化的更多相关文章
- 《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化
4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一 ...
- MYSQL 数据库结构优化
数据库结构优化 优化数据大小 使表占用尽量少的磁盘空间.减少磁盘I/O次数及读取数据量是提升性能的基础原则.表越小,数据读写处理时则需要更少的内存,同时,小表的索引占用也相对小,索引处理也更加快速. ...
- mysql性能优化学习笔记(5)数据库结构优化
一.选择合适的数据类型 1.使用可存下数据的最小的数据类型 2.使用简单地数据类型,Int<varchar 3.尽可能使用not null定义字段 4.尽量少用text, ...
- Mysql 性能优化5【重要】数据库结构优化
数据库设计的步骤 我们大多使用mysql 设计三范式 设置时区
- MySQL强人“锁”难《死磕MySQL系列 三》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 前言 最近数据库 ...
- 性能优化系列三:JVM优化
一.几个基本概念 GCRoots对象都有哪些 所有正在运行的线程的栈上的引用变量.所有的全局变量.所有ClassLoader... 1.System Class.2.JNI Local3.JNI Gl ...
- MySQL之数据库结构优化
1.选择合适的数据类型 一.选择能够存下数据类型最小的数据类型 二.可以使用简单的数据类型.int 要比varchar在MySQL处理上简单 三.尽可能的使用not null 定义字段 四.尽量少 ...
- MySQL优化三 表结构优化
由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大 ...
- 【MySQL优化】数据库结构优化
原则: 设计表结构,字段类型,最小化磁盘存储的空间,减少IO.数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面.所以尽可能减少 IO 读写量,可 ...
随机推荐
- 洛谷 - P2730 - 魔板 Magic Squares - bfs
写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...
- oppo手机怎么打开USB调试模式
OPPO手机USB调试的设置方法:1.ColorOS 3.0版本,进入设置--关于手机,连续点击版本号直到出现“您已处于开发者选项”,再进入设置--其他设置--开发者选项--USB调试进行设置: 2. ...
- HDU6031:Innumerable Ancestors(二分+倍增数组)
传送门 题意 n个点的图,有n-1条无向边,m个询问,每次询问 给出两个集合a和b,找到a的一个元素x,b的一个元素y,使得x和y的lca深度最大 分析 这道题如果直接暴力做,复杂度为O(mk1k2* ...
- P5162 WD与积木(多项式求逆+生成函数)
传送门 题解 比赛的时候光顾着算某一个\(n\)的答案是多少忘了考虑不同的\(n\)之间的联系了--而且我也很想知道为什么推着推着会变成一个二项式反演-- 设\(f_n\)为\(n\)块积木时的总的层 ...
- combobox级联检索下拉选择框
1.效果图 2.前端 @{ ViewBag.Title = "Index"; Layout = null; @*自动筛选下拉框*@ <script src="~/S ...
- (二分图最大匹配)51NOD 2006 飞行员配对
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
- AtCoder Grand Contest 003 D - Anticube
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_d 题目大意: 给定\(n\)个数\(s_i\),要求从中选出尽可能多的数,满足任意两个数之积 ...
- linux系统文件目录解析
/bin 二进制可执行命令 /dev 设备文件(硬盘/光驱等) /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录,下面会有以登录用户名作为文件夹名 ...
- 123 Best Time to Buy and Sell Stock III 买卖股票的最佳时机 III
假设你有一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易.注意:你不可同时参与多笔交易(你必须在再次购买前出售掉之前的股票).详见: ...
- HDU 2227 Find the nondecreasing subsequences dp思想 + 树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=2227 用dp[i]表示以第i个数为结尾的nondecreasing串有多少个. 那么对于每个a[i] 要去找 & ...