MySQL从青铜到王者第八篇:MySQL视图事务索引
Posted 森明帮大于黑虎帮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL从青铜到王者第八篇:MySQL视图事务索引相关的知识,希望对你有一定的参考价值。
系列文章目录
前言
一、视图
1.视图的概念
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
2.视图的基本使用
1.创建视图
create view 视图名 as select语句;
2.案例
①用雇员信息表中empno,ename,sal为字段创建一个视图view_emp,然后全列查询到视图view_emp的字段内容一样:
create view view_emp as select empno,ename,sal from emp;
②修改了视图,对基表数据有影响:
update view_emp set sal=1050 where empno=007369;
③修改了基表,对视图有影响:
update emp set sal=800 where empno=007369;
④删除视图:
drop view view_emp;
3.视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)。
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
- 视图不能添加索引,也不能有关联的触发器或者默认值。
- 视图可以提高安全性,必须具有足够的访问权限。
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的order by 将被覆盖。
- 视图可以和表一起使用。
二、事务
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。
1.事务基本操作
1.创建测试表
2.开始一个事务
start transaction;
3.提交事务
commit;
4.回滚事务
rollback to aa;
2.事务操作注意事项
- 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)。
- 如果一个事务被提交了(commit),则不可以回退(rollback)。
- 可以选择回退到哪个保存点。
- InnoDB支持事务,MyISAM不支持事务。
- 开始事务可以使用 start transaction。
3.事务的隔离级别
当我们有多个客户端同时操作数据库的某张表,如何进行隔离操作?MySQL提供了隔离级别。
当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。
1.无隔离性存在的问题
- 脏读:
- 是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
像这样,Mary记取的工资数8000是一个脏数据。
- 不可重复读:
- 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)。
1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
- 幻读:
- 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
目前工资为1000的员工有10人。
1.事务1,读取所有工资为1000的员工。
2.这时事务2向employee表插入了一条员工记录,工资也为1000。
3.事务1再次读取所有工资为1000的员工 共读取到了11条记录。
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题。
备注:不可重复读的重点是修改:同样的条件, 你读取过的数据,再次读取出来发现值不一样了 幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样。
2.事务的隔离级别
1.设置事务的隔离级别
set session transaction isolation level read uncommitted;
2.查看当前的隔离级别
select @@tx_isolation;
3.隔离级别:可串行化案例
4.当客户端A在执行select过程中,DBMS会对库加锁,如果这时客户端B执行插入,只要还没释放锁,插入不进去,会将B的update语句放入等待队列,直到释放了锁或超时。
说明:mysql默认的隔离级别是可重复读,一般情况下不要修改
4.事务的ACID特性
- 原子性(Atomicity)
- 事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分的最小逻辑执行体。
- 一致性(Consistency):
- 事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一致)的状态。因此一致性是通过原子性来保证的。
- 隔离性(Isolation)
- 各个事务的执行互不干扰,任意一个事务的内部操作对其他并发事务都是隔离的。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。
- 持久性(Durability)
- 持久性是指一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储其中(如:磁盘)。
三、索引
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
1.索引基本原理
- 占用磁盘空间。
- 当添加一条记录,除了添加到表中,还要维护二叉树,速度有影响,但不大。
- 我们添加一个索引,不能够解决所有查询问题,需要分别给字段建立索引;例如 select * from EMP whereename=‘abcdef’。
- 索引是以空间换时间。
2.创建索引
1.创建主键索引
①
– 在创建表的时候,直接在字段名后指定 primary key
create table user1(id int primary key, name varchar(30));
②
– 在创建表的最后,指定某列或某几列为主键索引
create table user2(id int, name varchar(30), primary key(id));
③
create table user3(id int, name varchar(30));
– 创建表以后再添加主键alter table user3 add primary key(id);
- 主键索引的特点:
- 一个表中,最多有一个主键索引,当然可以使符合主键。
- 主键索引的效率高(主键不可重复)。
- 创建主键索引的列,它的值不能为null,且不能重复。
- 主键索引的列基本上是int。
2.唯一索引的创建
①
– 在创建表的时候,直接在字段名后指定 primary key
create table user1(id int primary key, name varchar(30));
②
– 创建表时,在表的后面指定某列或某几列为unique
create table user5(id int primary key, name varchar(30), unique(name));
③
create table user6(id int primary key, name varchar(30));
alter table user6 add unique(name);
- 唯一索引的特点:
- 一个表中,可以有多个唯一索引。
- 查询效率高。
- 如果在某一列建立唯一索引,必须保证这列不能有重复数据。
- 如果一个唯一索引上指定not null,等价于主键索引。
3.普通索引的创建
4.全文索引的创建
当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,但是有要求,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。如果对中文进行全文检索,可以使用sphinx的中文版(coreseek)。
3.查询索引
4.删除索引
5.索引创建规则
总结
以上就是今天要讲的内容,本文详细介绍了数据库视图、事务、索引的使用,数据库提供了大量的方法供我们使用,非常的便捷,我们务必掌握。希望大家多多支持!另外如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。加油啊!
以上是关于MySQL从青铜到王者第八篇:MySQL视图事务索引的主要内容,如果未能解决你的问题,请参考以下文章
设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)