IT - 数据库
2021-07-15 20:36:23 1 举报
AI智能生成
数据库知识笔记
作者其他创作
大纲/内容
IT - 数据库
三大范式
什么是范式?
简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
数据表结构所符合的某种设计标准的级别
哪三种
列不可再分(列的原子性)
当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
确保每列完全依赖于主键(要求每个表只描述一件事情)
如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
确保每列直接依赖于主键,不依赖于其它非主属性(非主键外的所有列必须互不依赖)
设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
说明
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,当然要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库。
https://www.zhihu.com/question/24696366
分类
关系型数据库
非关系型数据库
mysql
语句
DDL:数据库定义语言(对结构进行操作)
DML:数据库操作语言(数据操作)
DQL(数据库查询语言)
事务
概念
把一个或多个DML操作当作一个不可分割的最小工作单元;要么全部成功,要么全部失败。
事务只和DML语句有关,或者说DML语句才有事务。
四大特性(AICD)
原子性
把一个事务视为数据库中一个不可分割的最小工作单位,事务的各步操作是不可分的(原子的);要么都执行,要么都不执行
化学角度类比:原子(atom)指化学反应不可再分的基本微粒,是一般物质的最小单位。数据库角度:是数据库中不可分割的最小工作单位。
隔离性
一个事务所做的修改在最终提交之前,对其他事务是不可见的。 -> 每一个事务在最终提交之前能够看到的数据总是一致的
隔离性保证别的事务不会影响当前事务
隔离级别
用来规定一个事务从开始直到提交之前,所做的任何修改对其他事务是否可见。
种类
未提交读
一个事务能读取到其他事务未提交的数据
导致脏读,不可重复读,幻读
提交读
一个事务只能读取到其他事务已经提交的数据
导致不可重复读,幻读
可重复读(mysql默认事务隔离级别)
同一个事务中多次读取同样记录的结果是一致的。
导致幻读
msyql通过多版本并发控制(MVCC)解决了幻读问题
使用了以乐观锁为理论基础的MVCC(多版本并发控制)来避免这两种问题
可串行化
并行事务的四大问题: 1.更新丢失:和别的事务读到相同的东西,各自写,自己的写被覆盖了。(谁写的快谁的更新就丢失了) 2.脏读:读到别的事务未提交的数据。(万一回滚,数据就是脏的无效的了) 3.不可重复读:一个事务读取到了另外一个事务中已提交的update的数据。 4.幻读:一个事务读取到了另外一个事务中已提交的insert或delete的数据。
持久性
一旦事务提交,则其所做的修改就会永久保存到数据库中。
一致性
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。
一致性是基础,也是最终目的,其他三个特性(原子性、隔离性和持久性)都是为了保证一致性的。原子性:比如有的操作成功,有的操作不成功,就不能保持一致性。持久性:比如数据库崩溃或者断电等情况,这个时候,依赖于对日志的 REDO/UNDO 操作就可以保证一致性持久性:原子性在并发情况下不能保证一致性。比如会存在脏读、幻读和不可重复读等问题,为了保证并发情况下的一致性,又引入了隔离性的概念。
事务锁
读锁
写锁
粒度
表
行
mvcc实现原理
其他
一致性是事务的最终目的,原子性、隔离性、持久性都是为了实现一致性。
存储引擎
innodb
MyISAM
MEMORY/HEAP
各自特点?
为什么默认的是innodb?
索引
是什么
存储引擎用于快速查找记录的一种数据结构
按照不同的角度分类
数据结构角度
b-tree
B树是为了磁盘或其它存储设备⽽设计的⼀种多叉(下⾯你会看到,相对于⼆叉,B树每个内结点有多个分⽀,即多叉)平衡查找树。 多叉平衡
B树的⾼度⼀般都是在2-4这个⾼度,树的⾼度直接影响IO读写的次数。
如果是三层树结构---⽀撑的数据可以达到20G,如果是四层树结构---⽀撑的数据可以达到⼏⼗T
r-tree
hash索引
全文索引
物理存储的角度
聚簇索引
以主键创建的索引
叶子节点存储的是主键和对应的数据行
是通往真实数据行的唯一途径
非聚簇索引
索引字段特性角度
主键索引
唯一索引
普通索引
前缀索引
组成索引的字段个数角度
单列索引
联合索引(复合索引)
二叉树
二叉查找树是基于二分查找法来提高数据查找速度的二叉树的数据结构;
二叉查找树是采用二分查找法把数据按规则组装成一个树形结构的数据,减少无关数据的检索,提升了数据检索的速度;
规则
顶端的节点称为根节点
不在顶端并且拥有子节点的节点称为非叶子节点,非叶子节点只能允许最多两个子节点
没有子节点的节点我们称之为叶子节点
若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值
平衡二叉树(红黑树)
子主题
B树(B-Tree)
B树和平衡二叉树不同,B树属于多叉树又名平衡多路查找树(查找路径不只两个),数据库索引里大量使用者B-Tree和B+Tree的数据结构。
不在顶端并且拥有子节点的节点称为非叶子节点,非叶子节点允许多个子节点
每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值
所有叶子节点均在同一层、叶子节点除了包含了关键字还包含了数据;
b+树
B树和B+树的最⼤区别在于⾮叶⼦节点是否存储数据的问题
B树是⾮叶⼦节点和叶⼦节点都会存储数据。
B+树只有叶⼦节点才会存储数据,⽽且存储的数据都是在⼀⾏上,⽽且这些数据都是有指针指向的,也就是有顺序的。 索引列 order by
哪些情况需要创建索引
1. 主键⾃动建⽴唯⼀索引2. 频繁作为查询条件的字段应该创建索引3. 多表关联查询中,关联字段应该创建索引 on 两边都要创建索引4. 查询中排序的字段,应该创建索引5. 频繁查找字段 覆盖索引6. 查询中统计或者分组字段,应该创建索引 group by
哪些情况不需要创建索引
1. 表记录太少
2. 经常进⾏增删改操作的表
3. 频繁更新的字段
4. where条件⾥使⽤频率不⾼的字段
优点
第一、通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四、在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的 时间。
第五、通过使用索引,可以在查询的过程中,使用查询优化器,提高系统的性能。
缺点
第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物 理空间。如果要建立聚簇索引,那么需要的空间就会更大。
第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降 低了数据的维护速度。
回表查询
主要涉及聚簇索引、非聚簇索引两个概念,非聚簇索引的叶子节点因为不包含整行的所有数据,索引会通过非聚簇索引找到数据行的主键,再通过聚簇索引查找整行数据的过程
索引覆盖
通过二级索引查询时,回表不是必须的过程,当 Query 的所有字段在二级索引中就能找到时,就不需要回表
执行计划
执行流程
建表规范
在数据库设计过程中,在满足业务需求的要求下,要考虑性能,其次才是三大范式。需求>性能>表结构
选用合适的数据类型
关联字段类型长度要一致
关联字段建立索引
NoSQL数据库
Redis
MongoDB
ElasticSearch
0 条评论
回复 删除
下一页