事务

begin   commit  rollback

每个语句都是一个事务,mysql默认开启自动提交,如果关闭,执行的语句都不会执行,除非自己提交commit语句

事务的特性

原子性 : 要么整体执行,要么整体不执行

一致性 : 保证数据库总体一致,A少了100,必定是在某个人这里多了100,保证整体数据完整性

隔离性 : 事务之间互相不影响,有四个隔离级别,  读未提交  读已提交  可重复读   串行化

持久性 : 执行后的数据存在了硬盘

 

 

事务隔离

脏读:  对最新的数据进行操作,如果事务A读到事务B插入的数据,事务B整体并没有执行完,还没提交,然后回滚了,事务A第二次读到的数据就不一样了,导致脏读

不可重复读: 事务A第一次读的时候 ,已经有了事务B的提交,读到事务B的数据, 然后事务C新插入了数据,事务A第二次读读到了 事务B与事务C插入的数据,数据不一致,导师不可重复读

幻读 : 更新的这些操作都是对最新的数据进行更新的,如果事务A第一次查询到数据B ,然后事务C插入了数据C,虽然用mvcc查询不到,但是如果因为某些条件修改了数据C,然后根据mvcc会将他的版本号更替为自己,然后下次读的时候会发现多了数据C,多的数据也叫幻行

 

读未提交:读数据会加上排他锁,可以读取到别的事务没有提交到的数据    无法解决 脏读  不可重复读 幻读

读已提交: 读数据会加上排他锁 ,可以读取到其他事务已提交的数据, 使用了mvcc ,但是只会在select之前建立一个视图,然后select查询前后其他事务插入数据,不会被查询到,只会查询到select之前的事务提交到的数据,然后如果中间有事务插入数据,但是没有commit,那么那个数据的版本号一定会在建立视图之前,就不会被查询到,解决脏读问题,无法解决 不可重复读,幻读问题,第二次查询和第一次查询之间的可能有其他事务提交了数据,所以不一致,不可重复读

可重复读:读数据会加上排他锁,也使用了mvcc,区别在于在事务一开始就建立了一致性视图,然后可以解决不可重复读问题, 解决幻读需要间隙锁

串行化: 直接对所有查询到的数据加了锁,其他事务不能够执行

 

mvcc

每条数据有两个隐形字段 ,  创建(创建前数据的事务ID A)   , 结束(删除时间的事务ID B

select  : 会查询当前ID在数据区间 [A,B]之间的

insert  : 会将插入的数据的创建 事务ID A 弄成当前insert的事务ID

update: 会弄新的一条数据但是创建ID不一样,原来那条数据的结束ID变成当前事务ID

delete:  将当前数据的结束ID变成当前事务ID

 

 

索引

普通索引

在某个列字段建立索引,会建立一棵B+树,用来查询

 

唯一索引

建立唯一索引,代表这一列的字段不会重复,但是需要直接执行,就不会用到redolog的优化,实际上能够不用唯一索引就别用

 

联合索引

代表使用多个字段进行建立索引,然后建立B+树

有一个最左原则:如果建立了a|b|c的索引,那么可以使用a   , a|b   , a|b|c的索引查询

 

聚簇索引和非聚簇索引

大牛博客:https://my.oschina.net/xiaoyoung/blog/3046779

聚簇索引实现

1.聚簇索引需要在磁盘上物理上有序,所以整个表只有一个聚簇索引,物理上有序的优点,本身b+树一个节点就是一个page,16kb,里面有很多行的数据,然后需要在磁盘中一次查询都找出来,磁盘本身是一个磁道,需要一个寻址,遍历所有地址,如果物理有序,就能够直接遍历一遍磁盘就能够把page的数据都找出来,但是如果不是的话就需要在第一圈找到第一个,然后再第二圈找第二个...

2.聚簇索引只有一个索引文件,叶子节点直接存取行数据,查询具体数据只需要查询一次

 

非聚簇索引实现

原理:在innodb中,主键就是建立了聚簇索引,其他的普通,唯一,联合索引都是非聚簇的,主键B+树使用自增id建立的B+树,也就是一个自增id会对应到一条具体数据,非聚簇索引的话就会用非聚簇索引的字段然后对应到主键自增id,然后再去跑主键B+树找到具体的数据,这个也叫回表

避免回表:如果我查询数据的话只是需要其中两三个字段,然后可能经常查询,可以考虑把那几个字段搞个联合索引,因为我非聚簇索引那棵树已经包含了这些数据,我就可以直接查询这棵树得到信息了,就不要找到id再去查了

 

索引下推:联合索引做查询的时候,如果下推的话的操作是,先去找到匹配第一个字段的,然后直接回表查询整条数据然后进行比较,然后发现不匹配,然后再去找下一个满足第一条条件的,然后再回表,这样的消耗非常大,通常大多数的情况可以,但是如果我的比较条件的字段都是数据聚合索引,那么我们就可以直接比较完所有条件后再去判断是否要回表,这样就会减少一次对B+树的查询,然后累积下来会减少很多次对B+树的查找

 

 

 

待更~