mysql 复习笔记 引擎 事务 视图

15存储引擎
15.1存储引擎的使用
数据库中各表均被(在创建表时)指定的存储引擎来处理mysql特有的其他db没有
show engines\G;底层存储方式不一样
memory
innoDB
myisam
想看表的
show create table emp;表级别存储引擎默认innodb 不同的表可以使用不同的存储引擎


MyISAM 最常用的引擎
他管理的表具有以下特征:
使用三个文件表示每个表: mysql server/data/mysql
格式文件 数据表结构的定义 mytable.frm
数据文件 存储表行的内容 mytable.MYD
索引文件 存储表上索引 mytable.MYI
灵活的auto_increment字段处理
可被转换为压缩,只读表 来节省空间 提高检索效率
不支持事务。效率很高


InnoDB默认 缺省 support:default
它管理的表具有下列主要特征:
每个innoDB表在数据库目录中以frm格式文件表示
innoDB表空间tablespace被用于存储表的内容
提供一组用来记录事务性活动的日志文件
用commit提交 savepoint 以及rollback回滚支持事务处理
提供全ACID兼容
在mysql服务器崩溃后提供自动恢复
多版本MVCC 行级锁定
支持外键及引用的完整性,包括级联删除和更新


memory存储引擎 速度最快 存到内存中
在数据库目录内,每个表均以.frm格式的文件表示
表数据及索引被存储在内存中
表级锁机制
不能包含text或blob字段
memory存储引擎以前被成为heap引擎
缺点存在内存无法持久化。


15.3选择合适的存储引擎
当创建表时,应根据表的应用场景选择适合的存储引擎
myisam表最适合于大量的数据读而少量数据更新的混合操作
myisam表的另一种适合场景是使用压缩的只读表
如果查询中包含较多的数据更新操作,应使用innodb,其行级锁机制和多版本的支持为数据读取和更新的混合操作提供了良好的并发机制
可使用memory存储引擎来存储非永久需要的数据或者是能够从基于磁盘的表中重新生成的数据
修改表存储引擎


16事务
16.1概述
什么是事务?对应英文transaction
事务:
一个最小的不可再分的工作单元。
通常一个事务对应了一个完整的业务。例如银行账户转帐业务,该业务就是一个最小的工作单元不可再分
而一个完整的业务需要批量的DML(insert update delete)语句共同联合完成
事务只和DML语句有关系,或者说DML语句才有事务
以上锁描述的批量的DML语句共有多少条DML语句,这个和业务逻辑有关系。业务逻辑不同DML语句的个数不同
2.关于银行账户转账操作,是一个完整业务,最小的单元不可再分
也就是说银行账户转账是一个事务。
t_act 账户表
actno     balance
——————————
act-001   50000.0
act-002   10000.0
执行转账操作10000:
update t_act set balance=40000.0 where actno='act-001';
update t_act set balance=20000.0 where actno='act-002';
以上两条dml要求同时成功/失败最小单元,不可再分。
当一条执行成功后并不能将底层db中第一个账户的数据修改,只是将操作记录了一下这个记录是在内存中完成的,第二条DML语句执行成功之后和底层数据库文件中的数据完成同步,若第二条DML语句执行失败,清空所有的历史操作记录。要完成以上功能必须借助事务


事务可以保证多个操作原子性,要么全成功/失败。对于数据库来说事务保证批量的DML要么成功/失败,3.事务具有四个特性ACID
A原子性 整个事务中的所有操作,必须作为一个单元全部完成 或全部取消
事务是最小的工作单元,不可再分
C一致性 在事务开始之前与结束之后,数据库都保持一致状态
事务要求所有的DML操作的时候必须同时成功/失败
I隔离性 一个事务不会影响其他事务的运行
事务A和B之间具有隔离
D持久性 当事务完成以后,该事务对数据库所做的更改将持久的保存在数据库之中,并不会被回滚
是事务的保证,事务终结的标志  内存中数据持久到硬盘文件中


4.关于一些术语
开启事务 start transaction
提交事务 end transaction
事务结束 commit transaction
回滚事务 rollback transaction


5.和事务有关的两条重要的sql语句:【TCL】
commit 提交
rollback 回滚
savepoint


6.事务开启的标志是什么 结束的标志是什么
开启的标志:任何一条DML insert update delete执行 标志事务的开启
结束的标志:提交(成功将所有的dml操作和硬盘文件数据同步)或者回滚(失败,将所有的dml语句操作历史记录全部清空)
   
7重点:
在事务进行过程中,未结束之前,DML语句是不会更改底层数据库文件中的数据。
只是将历史操作记录一些,在内存中完成记录,只有在结束的时候,而且是成功的技术的时候才会修改底层硬盘文件中的数据。


8.在mysql db中事务的提交和回滚演示
insert into t_user(name) values('zhangsan')
mysql DBMS中默认情况下 事务是自动提交的,也就是说只要执行一条DML语句开启事务并且提交事务
这种自动提交机制是可以关闭的:【以下关闭自动提交,这只是一种方式】
start transaction;
insert into t_user(name) values('wangwu')
'zhaoliu'
commit;手动提交
再开一个session发现没有wangwu zhaoliu,手动提交后就有了


start transaction;
DML语句
DML语句
commit;手动提交事务 事务 成功的结束
rollback; 手动回滚 事务 
失败的结束


关闭自动提交的第二种方式
set autocommit=off;on
show variables like ‘%auto%’
show                ‘%char%’
show    ‘%commit%’
以上只对当前会话有效。
打开
set autocommit=on 以上打开和关闭自动提交机制只对当前会话有效


9.事务的四个特性之一 隔离性
9.1事务a和事务b之间具有一定的隔离性
9.2隔离性有隔离级别(4个):
read uncommitted读未提交
read committed读已提交
repeatable read可重复读
serializable串行化
9.3 read uncommitted 读未提交
事务A和事务B,事务A未提交的数据,事务B可以读取到。
这里读取到的数据可以叫做脏数据dirty read
这种隔离级别是最低级别,这种级别理论上存在数据库默认一般都是高于这个。


9.4 read committed 读已提交
事务A和B,A提交的数据,B才能读到
这种隔离级别高于上面的读未提交
换句话说 对方事务提交后的数据 我当前事务才能够读到
这种隔离级别避免读脏数据
这种隔离级别会导致 不可重复读取
oracle默认就是这个。


9.5repeatable read 可重复读
事务A和事务B 事务A提交之后的数据 事务B读取不到
事务B是可重复读取数据的。
这种隔离级别高于读已提交 换句话说 对方提交之后的数据我还是读取不到
这种隔离级别可以避免读脏数据和 不可重复读 达到可重复读取
mysql默认的就是这个
虽然可以达到 可重复读 的效果 但是会导致 幻象读
81lession
9.6 serializable 串行化
事务A和事务B,事务A在操作DB中数据的时候 事务B只能排队等待。
很少用 吞吐量太低 用户体验不好 可以避免幻象读 每次读的都是表中真实的记录
事务A和事务B不再并发


10怎么设置隔离级别
10.1 第一种 修改my.ini配置文件
[mysqld]加上
transaction-isolation=
read-committed
read-uncommitted
repeatable-read
serializable
第二种方式 使用命令方式修改
命令格式 set《无/session/global》 transaction isolation level《isolation-level》;
可选值同上。


怎么查看当前隔离级别
select @@tx_isolation;
select @@session.tx_isolation
select @@global.tx_isolation




12并发事务与隔离级别示例
12.1 读未提交 read uncommitted
会话1
——————
A修改成第一档
start transaction 不commit   B去select可以拿到
set global transaction isolation read uncommitted
12.2 读已提交 read committed
set global transaction isolation read committed
A start transaction;不提交  提交
B start               查不到 查到
12.3 可重复读 repeatable read
set global transaction isolation repeatable read;
会话1 use db start transaction;insert into t_user(name) values('luzhishen');
会话2 use db ……      ;不管怎么操作都查不到


83索引
1.什么是索引 了解
索引对应的单词是index
索引相当于一本书的目录,索引的作用是提高程序的检索查询效率
2.主键自动添加索引,所以能够通过主键查询尽量通过主键查询,效率较高
3.索引和表相同都是一个对象,表是存储在硬盘文件中的,那么索引是表的一部分
索引也是存储在硬盘文件中
4.mysql dbms中,对表中记录进行检索的时候通常包括几种检索方式
第一种:全表扫描【效率较低】
假设有一张表:emp员工表
select* from emp where ename=‘King’;
若ename自端上没有添加索引,那么在通过ename字段过滤数据的时候全部扫描
假设有一张表:dept部门表
select * from dept where dname=‘accounting’
若dname字段没有索引 则通过这字段过滤的时候ename字段被全部扫描


第二种:索引检索 提高查询效率
一张表中有多个字段,每一个字段都是可以添加索引的
1.该字段数据量庞大,数据量上到百万级别建议加索引 
2.该字段很少DML操作 DML操作多的话索引也要相应维护 效率反而脚底,经常改的不建议加索引  
3.经常出现在where的建议加索引


7怎么创建索引
1.create 【unique】 index u_ename on emp(ename)
索引名     表名(列名)
加上unique相当于加了唯一性约束
create index dept_dname_index on dept(dname) ;//index前加unique 加了唯一性约束
2.alter table 表名 add unique index 索引名(列名)


8怎么删除索引
drop index dept_dname_index on dept;


18视图
什么是视图
create view myview as select * from emp;
select * from myview;
select empno,ename from myview;
delete from myview;


create view deptview as select deptno as a,dname as b,loc as c from dept;
select * from deptview;
select a,b,c from deptview;隐藏表的实现细节 数据库没有直接暴露给你,隐藏化妆成a b c做业务
create view myview as DQL 只能接DQL


DBA命令
新建用户
create user username identified by ‘password’;
create user p361 identified by ‘123’
可以登录但是只能看见一个库 information_schema
授权
grant all privileges on dbname.tbname to username@login ip indentified by password with grant option


导入导出要会
dos
导出 dos>mysqldump bjpowernode>d:\bjpowernode.sql -uroot -p123
导出指定表dos> mysqldump bjpowernode emp>d:\bjpowernode.sql -uroot -p123
mysql> 导入 source d:\bjpowernode.sql


数据库设计三范式
设计数据库表的时候锁一句的规范 共三个规范
第一范式
要求有主键并且要求每一个字段原子性不可再分


第二范式
要求所有非主键字段完全依赖主键,不能产生部分依赖


第三范式
所有非主键字段和主键字段之间不能产生传递依赖


几个比较经典的设计:
一对一必须有主键 两种方案 分两张表存储 共享主键
t_husband
hno(pk)    hname
-------------------
t_wife
wno(pk)    wname  wno同时也是fk引用t_husband中的hno




/方案2 分两张表存储 外键唯一  多的一方加唯一性约束
hno(pk)    hname     wifeno(fk-unique)
-------------------
t_wife
wno(pk)    wname 


一对多 俩表 以存储在一张表中,多存储在一张表中,在多的那张表添加外键指向一 学生外键 班级 
多对多 仨表,学生表中存学生信息 课程表 课程信息 学生选课表 存关系信息


实际开发中是怎样的
尽量遵循三范式,取舍,有时候拿冗余换速度
最终目的满足客户需求。

你可能感兴趣的:(mysql)