mysql基础(3/3)
存储引擎的本质
通过采用不同的技术将数据存储在文件或内存中 每一种技术都有不同的存储机制,不同的存储机制提供不同的功能和能力 通过选择不同的技术,可以获得额外的速度或功能,改善我们的应用
查看存储引擎
show engines\G
1)在建表时,可使用<ENGINES>选项为CREATE TABLE语句显示指定存储引擎
create table table_name(
no int(4),
)engine = MylSAM;
2)如果创建表时没有指定存储引擎,则使用当前默认的存储引擎
3)默认的存储引起可在my.ini配置文件中使用default-storage-engin选项指定
4)修改表的存储引擎使用
alter table 表名 engine = 存储引擎名称
5)查看表使用的存储引擎
show create table emp\G
show table statuslike 'emp'\G
常用的存储引擎
MylSAM存储引擎
MyISAM引擎是MySQL数据库最常用的
它管理的表具有以下特征:
使用三个文件表示每个表:
a)格式文件——存储表的结构
b)数据文件——存储表的数据
c)索引文件——存储表的索引
可转换为压缩、只读表来节省空间
InnoDB存储引擎
InnoDB存储引擎是MySQL数据库的缺省引擎;
它管理的表具有以下特征:
a)每个InnoDB表在数据库目录中以.frm格式文件表示
b)InnoDB表空间tablespace被用于存储表的内容
c)提供一组用来记录事务性活动的日志文件
d)用commit、savepoint及rollback支持事务处理
e)提供全部ACID兼容
f)在MySQL服务器崩溃后提供自动恢复
g)支持外键及引用的完整性,包括级联更新和删除
MEMORY存储引擎
使用MEMORY存储引擎的表,因为数据存储在内存中,且行的长度固定,所以使得MEMORY存储引擎非常快
MEMORY存储引擎管理的表具有下列特征:
a)在数据库目录内,每个表均以.frm格式文件表示
b)表数据及索引被存储在内存中
c)表级锁机制
d)字段属性不能包括TEXT或BLOB字段
选择合适的存储引擎
MyISAM表最适合于大量的数据读而少量数据更新的混合操作。MyISAM表的另一种适用情形是适用压缩的只读表。
如果查询中包含较多的数据更新操作,应适用InnoDB,其行级锁机制和多版本的支持为数据读取和更新的混合提供了良好的并发机制
使用MEMORY存储引擎存储非永久需要的数据,或者是能够从基于磁盘的表中重新生成的数据
事务Transaction
事务是什么
1)一个最小的不可再分的工作单元
2)通常一个事务对应一个完整的业务
3)而一个完整的业务需要批量的DML语句共同完成
4)事务只和DML语句有关系,或者说只有DML语句才有事务
概述
事务具有四个特性ACID:
1)原子性
事务是最小单元,不可再分
2)一致性
事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败
3)隔离性
一个事务不会影响其他事务的运行
4)持久性
在事务完成之后,该事务对数据库所作的更改将持久地保存在数据库中,并不会被回滚
事务中的一些概念
1)开启事务:start transaction
2)结束事务:end transaction
3)提交事务:commit transaction
4)回滚事务:rollbakc transaction
和事务有关的两条SQL语句
1)commit:提交
2)rollback:回滚
事务开启和结束的标志
开启:任何一条DML语句执行,标志事务的开启
结束:
a)提交:成功的结束,将所有的DML语句操作记录和底层硬盘文件中数据进行一次同步
b)回滚:失败的结束,将所有DML语句操作记录全部清空
MySQL事务的提交和回滚
MySQL默认事务:自动提交show variables like '%commit%';
在MySQL数据库管理系统中,默认情况下,事务是自动提交的;也就是说,只要执行一条DML语句,就开启了事务,并且提交了事务;
第一种:关闭MySQL事务自动提交
1)事务成功用法:start transaction; commit;
第一步:start transaction; 手动开启事务
第二步:DML语句... 执行批量DML语句
第三步:commit; 手动提交事务
2)回滚提交用法:start transaction; rollback;
第一步:start transaction; 手动开启事务
第二步:DML语句... 批量DML语句
第三步:rollbakc; 手动回滚事务
第二种:关闭MySQL事务自动提交:只对当前会话有效
1)两种关闭自动提交事务
a)set autocommit = off
b)set session autocommit = off
2)两种打开自动提交事务
a)set autocommit = on
b)set session autocommit = on
注:以上打开或关闭事务只对当前窗口有效
事务的隔离级别
事务四个特性ACID之一:隔离性(isolation)
隔离性有四个隔离级别:
1)read uncommitted 读未提交
2)read committed 读已提交
3)repearable read 可重复读
4)serialiazble 串行化
read uncommitted 读未提交(级别最低)
1)事务A和事务B,事务A未提交的数据,事务B可以读取
2)这里读取的数据可以叫做“脏数据”或“脏读Dirty Read”
3)读未提交隔离级别最低,这种级别一般只在理论上存在,数据库默认隔离级别一般都高于该隔离级别
read committed 读已提交
1)事务A和事务B,事务A提交的数据,事务B才可读取到;
2)该隔离级别高于“读未提交”级别;
3)换句话说:对方事务提交之后的数据,当前事务才可读取到;
4)该隔离级别可以避免脏数据;
5)该隔离级别能够导致“不可重复读”
repeatable read 可重复读
1)事务A和事务B,事务A提交之后的数据,事务B读取不到
2)事务B可重复读到数据的
3)这种隔离级别高于“读已提交”
4)换句话说,对方提交之后的数据,还是读取不到
5)这种隔离级别可以避免“脏读和不可重复读”,达到“重复读取”
6)MySQL数据库管理系统默认隔离级别为:可重复读
7)虽然可以达到“可重复读”,但是会导致幻象读
serializable 串行化
1)事务A和事务B,事务A在操作数据库表中数据的时候,事务B只能排队等待
2)这种事务隔离级别一般很少使用,吞吐量太低,用户体验不好
3)这种隔离级别可以避免幻象读,每一个读取都是数据库表中真实的记录
4)事务A和事务B不再并发
查看隔离级别
1)查看当前会话级隔离级别
select @@tx_isolation
select @@session.tx_isolation
2)查看当前全局隔离级别
select @@qlobal.tx_isolation
设置服务器缺省隔离级别
1)修改my.init配置文件
transaction-isolation = READ-COMMITTED
隔离级别可选项为:
-READ-UNCOMMITTED
-READ-COMMITTED
-REPERATABLE-READ
-SERIALIZABLE
2)通过命令方式设置事务隔离级别
set transaction isolation level is xxx
隔离级别可选项为:
-READ-UNCOMMITTED
-READ-COMMITTED
-REPERATABLE-READ
-SERIALIZABLE
视图
什么是视图
1)视图在数据库管理系统中也是一个对象,也是以文件形式存在的
2)视图对应了一个查询结果,知识从不同的角度查看数据
创建视图
语法结构:create view 视图名称 as 查询语句
create view myview as select empno,ename,sal from emp;
删除视图
语法结构:drop view if exists 视图名称
drop view if exists myview
修改视图
语法结构:alter view 视图名称 as 查询语句
alter view myview as select deptno,ename,job,sal from emp;
数据库设计三范式
第一范式:主键、字段不能再分
定义:要求有主键,数据库中不能出现重复记录,每一个字段是原子性不能再分;
1)每一行必须唯一,也就是每个表必须有主键
2)主键通常采用数值型或定长字符串表示
3)关于列不可再分,应根据具体的情况来决定
第二范式:非主键字段完全依赖主键
定义:第二范式是建立在第一范式基础之上,要求数据库中所有非主键字段完全依赖主键,不能产生部分依赖