一、MySQL的基本引入
三范式设计
1、早期数据库使用,需要节省空间,通过对表结构设计进行节省空间操作,需要利用三范式设计
三范式可以最大程度节省空间(浪费时间)
第一范式:数据库字段不可拆分
userPhone违反了第一范式,因为电话号码可以分为座机和手机两个字段
第二范式:满足第一范式前提,所有非主键字段,必须依赖全部的注解(复合主键)
上图违反了三范式的第二范式,classname和stuId无关,可以拆分成两个表
第三范式:第二范式前提下,非主键字段必须全部依赖主键字段,不能依赖其他非主键字段
上图违反了第三范式设计,因为学院name依赖的是学院Id,依赖的不是主键
需要进行拆分
一旦严格按照三范式设计,每个表维护全局唯一的一批内容,节省了空间
二、由MySQL引出的数据结构
mysql的索引数据结构B+Tree
二叉树
问题:如果跟节点每选好,有可能数据向一边倾斜,链式查询
平衡二叉树
叶子节点的高度偏差不能超过1
如果高度差超过1,可以通过左旋、右旋达到平衡
问题一:效率低,数据量很大时,树变得很高,磁盘io次数很多
问题二:查询不稳定,有可能一次,也有可能很多次
问题三:节点数据太少,没哟充分利用磁盘io(默认一次io传输4k数据)
B-Tree
每个节点可以保存多个关键字,每次io默认16k
相比二叉树:
树高大大减小,充分利用磁盘(每个节点放满16k)
B+Tree
与B-Tree类似
B+Tree特点:
特点1:半闭合的区间
特点2:根与支节点只保存关键字和子节点引用,不保存具体数据的位置信息
特点3:叶子节点的每个元素都有下个元素的引用,所有子节点形成链表
与B-Tree比较
优势一:全表扫描快,只需扫描叶子即可,叶子有数据的引用
优势二:排序功能强,因为叶子天然排序
优势三:一次io获取的关键字更多(由于根和支节点只保存关键字),一次读的更多,树高小
优势四:查询效率更稳定(看似b-Tree效率高,但是由于树高小,磁盘io少)