数据库复习总结
基本概念
元祖:元组就是一行
码:就是属性,对应一列
候选码:能唯一标识实体的
主码:主键,唯一标识一个元祖,不能为空,一个表只能有一个主键。
外码:外检,一个关系中的某一个属性是其他关系中的主键
使用外键就可以使用级联操作减少代码量。
ER图
一般使用ER图来厘清数据库的关系。
数据库范式
1NF(第一范式)
属性不能再被分割了,保证属性的原子性
2NF(第二范式)
简单来说,存在一个主键,且其他列的元素对于主键都是完全依赖而不是部分依赖。可以举一个联合主键来说明
(姓名,课程)——》分数
分数是完全依赖于姓名和课程的。这样的关系是ok的
但是
(学号,课程)——》姓名,这个是不对的,因为姓名只依赖于学号,不依赖于课程。
在2NF的基础上 3NF 消除传递依赖。
比如一张表
学生 课程 系主任 系
主键为学生。其三他三个属性完全依赖于学生符合第二范式,可以通过系主任查询到系,这就不符合第三范式
学生 课程
系主任 系 这样就是符合第三范式了。
drop delete truncate
drop table 表明明,删除表
truncate 清空一张表里面的数据
delete 删除一列数据
DDL 与DML
DDL是增删改查等一些操作
DML是数据库定义操作
Mysql 的一些
什么是关系型数据库
什么是非关系型数据库
关系型数据库:一张二维的表,每一个元组拥有的元素都是固定的(有几列都是相同的)
非关系型数据库:每一个元组拥有的元素并不是固定的(可能多几列可能少几列)
Mysql 的引擎问题
InnoDB和MyISAM
其中,InnoDB提供事务支持,支持行级锁和表级锁,支持外键
MyISAM不支持事务(就不能回滚),不支持外键
Mysql 锁
- 表级别锁:一锁锁一整张表
- 行级别锁:一锁锁一行数据
- 乐观锁:给数据加一个版本号
- 悲观锁:锁死,事务完成之后才能动
事务
所谓事务就是一组操作逻辑,要么都执行,要么都不执行
ACID
原子性:操作不能被切割,事务就是最小的单位。
隔离性:事务与事务之间彼此隔离
持久性:事务提交之后的改变是持久化保存在磁盘上的
一致性:一致性,执行前后数据保持一致
事务的隔离级别以及会发生的错误
- 读未提交
- 读已提交
- 可重复度
- 串行化
脏读:当事务的隔离级别处于读未提交时,每一个事务都能看到其他事务的执行结果。这个时候存在事务A和事务B。事务A修改了数据但是未提交,事务B此时查询数据,查询到的是事务A未提交的数据,此时事务A因为某些原因回滚了操作,那么此刻事务B查询到的数据就是脏数据。
丢失修改:当事务A读取数据并且做出改变,此时事务B也读取数据做出改变,数据A提交,数据B提交就会导致有一个修改被忽视了。
解决脏读的可以使用读已提交来完成,处于读已提交的事务,不能查看到其他事务未提交的数据。就不存在读取到的数据被回滚的情况了。但是这个会导致一个不可重复读的问题。举例事务B查询了数据,此刻事务A修改了这个数据并且提交了,事务B再次查询这个数据。事务B的两次查询结果是不相同的,这个就导致了事务B不可重复读。
解决不可重复读的隔离级别是,可重复读。这个级别也是mysql默认的事务隔离级别。其核心就是,当一个事务开启的时候,他会记录此刻数据库的状态,其他的事务就算已经提交了,对数据库的改变,对于开启了可重复度级别的事务也是不可见的。比如事务A开启了,此刻事务B修改了数据库,但是这个修改对于事务A是看不到的。这个就会导致一个问题,幻读。当事务B往数据库新增了几条数据,但是事务A是查不到的,这就是幻读了。
解决幻读的问题使用的是串行化。可以理解为一个时刻只有一个事务在运行,当这个事务结束之后,才能有第二个事务执行,这个级别非常浪费资源。
一条sql语句是如何被执行的
- 查询语句
- 查询该语句是否有权限,如果没有权限直接返回错误信息
- 通过分析器进行词法分析,提取关键元素,判断是否有语法错五
- 优化器执行sql语句
- 更新
- 查询缓存
Mysql索引机制
-
什么是索引是一种用于快速查询和检索数据的数据结构。常见的索引有B树、B+树和Hash。
举个例子,索引就相当于一个目录,有目录当然查的快咯。 -
索引的优缺点
- 优点
- 保证了数据的唯一性
- 提高查询速度
- 缺点
- 创建维护索引带来消耗
- 索引需要额外的物理空间
- 优点
-
Mysql中索引的类型
- 一张数据表里面只能有一个主键,且主键不能为null,不能重复
- 二级索引
- 唯一索引。列表中你不能出现重复数据,但是允许数据为null
- 普通索引
- 前缀索引
- 全文索引
-
索引的底层数据结构
是用B+Tree(真的用B+Tree来做)来做的 特点就是叶子结点可以访问下一个叶子结点,而且只有叶子结点存数据 -
用B树做索引的话,结点又放数据又放索引,叶子结点彼此独立,查询的时候使用二分查找。
-
用Hash做索引的话会导致哈希冲突等问题