您的位置:首页 > 数据库 > MySQL

mysql 复习笔记 引擎 事务 视图

2018-01-11 20:01 357 查看
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

r
4000
ead-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 

一对多 俩表 以存储在一张表中,多存储在一张表中,在多的那张表添加外键指向一 学生外键 班级 

多对多 仨表,学生表中存学生信息 课程表 课程信息 学生选课表 存关系信息

实际开发中是怎样的

尽量遵循三范式,取舍,有时候拿冗余换速度

最终目的满足客户需求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: