1、事务(Transaction)
(1)事务的概述
一个事务是一个完整的业务逻辑单元,不可再分。
(2)事务相关的语句是:DML语句(insert、update、delete)
事务是为了保证数据的完整性,安全性的
(3) 业务需要使用事务机制的原因:主要是因为一个业务往往徐亚多种DML语句
事务的特性:ACID
(1)原子性( [atomicity](javascript:😉):事务不可再分
(2)一致性([consistency](javascript:😉):事务保证多条DML 语句同时成功否则都不成功过
(3)隔离性([isolation](javascript:😉 ):事务A B之间具有隔离
(4)持久性([durability](javascript:😉 ):最终的数据都要持久大硬盘文件中,事务才算成功
事务的隔离级别
(1)读未提交(read uncommitted)
描述现象:A修改完数据没有提交,但是B可以读到A修改完的数据
产生的问题:读取了为提交完的数据,称为**“脏读”**
(2)读已提交(read committed)
描述现象:A修改完数据了,B可以读到数据
解决了 脏读 的问题
产生的问题:不可重复读(事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。)
(3)可重复读(repeatable read)
解决了不可重复读的问题
存在的问题:读取到的数据都是幻想:幻读
(4)序列化读/串行化读(Serializable )
解决了全部的问题
存在的问题: 效率低下,需要事务之间的排队
2、索引
(1)什么叫索引?索引的作用?
索引可以理解为一本书的目录,通过索引可以快速的找到对应的资源
(2)在数据库,查询一张表的有两种检索的方式?
全表扫描
根据索引来检索(效率高)
(3)索引提高检索的效率的原理:缩小了扫描的范围。
(4)创建索引和删除索引?
create index 索引的名称 on 表名(字段名);
drop index 索引的名称 on 表名;
(5) 什么时候添加索引?
数据量多的时候
这个字段很少使用DML操作
这个字段经常在where 子句中
注意:
主键和其他的unique约束的字段自动会添加索引。
(6)查看SQL语句的执行计划:
explain select 语句;
(7) 索引的实现原理
索引底层使用的数据结构是:B+Tree
索引的实现原理:
通过B+Tree 来缩小扫描的范围,底层索引先进行了排序—>分区—>,索引会携带数据在表中最终通过检索来找到数据,进而找到与之对应的物理地址,通过物理地址定位表的数据;
select ename from emp where ename = 'SMITH'; 通过索引转换为: select ename from emp where 物理地址 = 0x3;
(8)索引的分类?
单一索引
复合索引
主键索引
唯一索引
…
(9)索引的失效
使用模糊查询的时候,第一个字符是使用%,索引失效。
2、视图(view)
(1) 视图:同一张表的不同的角度去看待。
(2)创建视图和删除视图
create view myview(视图的名字) as select 语句;
drop view myview(视图的名字);
只有DQL语句才能创建视图对象。
对视图的增删改查,会影响原表的数据。
(3) 为什么使用视图?
视图可以隐藏表的实现细节,保密的数据,对外提供的是视图,不会吧原表给你的。
3、DBA命令
(1)将数据库当中的数据导出
在windows的dos命令窗口中执行:(导出整个库)
mysqldump 数据库名>D:\名字.sql -uroot -pXXXX
在windows的dos命令窗口中执行:(导出指定数据库当中的指定表)
mysqldump 数据库名 emp>D:\名字.sql -uroot –pXXXX
(2)导入数据
create database JJ(数据库名);
use JJ;
source D:\名字.sql
4、数据的设计的三范式(重点)
第一范式:要求任何一张表都应该有主键,并且每一个字段不可在分。
第二范式: 在第一范式的基础上,满足所有的主键字段完全依赖主键,不能产生部分依赖。
第三范式:在第二范式的基础上,满足所有的非主键字段直接依赖主键,不能产生传递依赖。
设计表的结构,满足三范式就能够避免数据的冗余:
多对多的表设计:三张表,其中关系表中两个外键;
一对多的表的设计:两张表, 其中多的那张表中设计外键;
一对一的表的设计:主键共享和外键唯一
案例一:多对多
t_student学生表
sno(pk) sname
-------------------
1 张三
2 李四
3 王五
t_teacher 讲师表
tno(pk) tname
---------------------
1 王老师
2 张老师
3 李老师
t_student_teacher_relation 学生讲师关系表
id(pk) sno(fk) tno(fk)
----------------------------------
1 1 3
2 1 1
3 2 2
4 2 3
5 3 1
6 3 3
案例二:一对多
班级t_class
cno(pk) cname
--------------------------
1 班级1
2 班级2
学生t_student
sno(pk) sname classno(fk)
---------------------------------------------
101 张1 1
102 张2 1
103 张3 2
104 张4 2
105 张5 2
案例三:一对一
t_user_login 用户登录表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk+fk) realname tel ....
------------------------------------------------
1 张三 1111111111
2 李四 1111415621
一对一设计有两种方案:外键唯一。
t_user_login 用户登录表
id(pk) username password
--------------------------------------
1 zs 123
2 ls 456
t_user_detail 用户详细信息表
id(pk) realname tel userid(fk+unique)....
-----------------------------------------------------------
1 张三 1111111111 2
2 李四 1111415621 1
注意:在实际的开发业务中,我们可以采用数据冗余的方式来换取时间。