MySQL 学习第六天
- 事务(Transaction)
- 提交事务
- 回滚事务
- 事务的特性
- 关于事务之间的隔离性
- 索引实现原理
- 索引分类
- 三范式都是哪些
事务(Transaction)
- 什么是事务
- 一个事务是一个完整的业务逻辑单元,不可再分
比如
银行转账从A账户向B账号转账10000,需要执行两条update语句
update t_act set balance = balance - 10000 where acton = \'act-001\'update t_act set balance = balance + 10000 where acton = \'act-002\'
以上两条DML语句必须同时成功或同时失败,不允许出现一条成功一条失败。
要想保证以上的两条DML语句同时成功或者同时失败,,那么就需要使用数据库的事务机制了。
和事务相关的语句只有:DML(insert delete update)
它们这三个语句都是和数据库当中的‘数据’相关的
事务的存在是为了保证数据的完整性和安全性
提交事务
commlt
把历史操作一并同步到硬盘文件当中。硬盘文件以旦改了之后历史操作一并清空了。
回滚事务
rollback
把历史操作清空,不和硬盘打交道
事务的特性
事务包括3大特性:ACID
A:原子性:事务是最小的工作单元,不可再分
C:一致性:事务必须保证多条DML语句同时成功或同时失败
D:隔离性:事务A与事务B之间具有隔离性
D:持久性:持久性说的是最终数据必须久化到硬盘中,事务才算成功结束
关于事务之间的隔离性
事务隔离性存在隔离等级,理论上隔离等级包括4个:
- 第一等级:读未提交 (read uncommitte)
- 对方事务还没有提交,我们当前实际可以读取到对方未提及交的数据
读未提交存在脏读(Dirty Read)现象 - 第二等级 读已提交 (read committeld)
- 这种隔离解决了脏读现象。
对方事务条件之后的数据我方可以读到。
读已提交存在的问题是:不可重复读。 - 第三级别:可重复读 (repeatable read)
- 这种隔离级别解决了:不可重复问题。
这种隔离级别存在的问题是:读取到的数据是幻象 - 第四级别:序列化读 / 串行化读
- 解决了所有问题
效率低,需要排队执行
MySQL数据默认的隔离等级是:可重复读
MySQL事务默认情况不是自动提交的
- 什么是自动提交
- 只要执行任意一条DML语句则提交一次。
- 怎么关闭自动提交
- start eransaction;
设置事务的全局隔离级别
set global transaction isolation level 隔离级别;
查看事务的全局隔离级别
select @@global.tx isolation;
================================================
索引
什么是索引,有什么用
索引就相当于一本书的目录,通过目录可以快速的找到对应的资源。
- 在数据库方面,查询一张表的时候有两种检索方式
- 第一种:全表扫描
第二周:根据索引检索(效率高) - 索引为什么可以提高检索效率
- 其实最根本的原理是缩小了扫描的范围。
索引虽然可以提升检索效率,但是不能随意添加索引,因为索引也是数据库当中的对象,也需要数据库不断的维护。是有维护成本的。比如,表中的数据经常被修改这样就不适合添加索引了,因为数据库一旦修改,索引需要重新排序,进行维护。 - 什么时候给字段添加索引
- 数据量大
该字段很少DML操作
改字段经常出现在where子句当中
给字段添加索引
create index 索引名称 表名(字段名)
删除索引对象
drop index 索引名称 on 表明;
索引什么时候失效
模糊查询的时候,第一个通配符使用的是%,这个时候索引失效的。
索引底层采用的数据结构是: B + Tree
================================================
索引实现原理
通过B Tree缩小扫描范围,底层索引进行了排序分区,索引会携带数据在表中的物理地址最终,通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中数据。效率是最高的
select ename from emp where ename = ‘SMITH’;
通过索引转换成
select ename from emp where 物理地址 = ox3;
================================================
索引分类
单一索引:给单个字段添加索引
复合索引:给多个字段添加索引
主键索引:主键上会自动添加索引
唯一索引:有nuique约束的字段上会自动添加索引
================================================
视图
什么是视图
站在不同的角度去看到数据。
怎么创建视图
select view 视图名字 as select语句
怎么删除视图
drop view 视图名字;
注意:
只有DQL语句才能以视图对象的方式创建出来
对视图进行增删改查,会影响到原表数据(通过视图影响原来数据,不是直接操作原表)
可以对视图进行CRUD操作
- 视图的作用
- 视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,java程序员只对视图对象进行CRUD。
DBA命令
将数据库当中数据导出
在windows的dos命令窗口中执行:
mysqlump 数据库名> 绝对路径 -u用户 -p密码
导入数据
create database 数据名字
数据库设计三范式
- 什么是设计范式
- 设计表的休据。按照这三范式设计的表不会出现数据冗余。
注意:
在实际开发中,以满足的需求未主,有的时候会拿冗换执行速度
三范式都是哪些
- 第一范式:
- 任何一张表都应该有主键,并且每一个字段原子性不可再分
- 第二范式
- 建立在第一范式的基础之上,所有非主键字段完全依赖主键,不能产生部分依赖。
多对多 三张表 关系两个外键 - 第三范式
- 建立在第二范式的基础之上的,所有非主键字段直接依赖主键,不能产生传递依赖。
一对多 两张表 多的表叫外键