zoukankan      html  css  js  c++  java
  • mysql 三大块 事务 索引 锁

    事务

    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+树的查找

    待更~

  • 相关阅读:
    js中setTimeout、setInterval、 clearInterval方法简介
    分享一个VS2008漂亮的黑色主题
    最简单的设计模式
    记一次查数据的需求
    Oracle常用存储过程写法
    关于域名解析
    使用PHP打造QQ空间神奇图片
    自制小工具含源码——SPTC上海交通卡余额查询
    自制小工具含源码——博客园图床ImageBed
    不可不知的mysql 常用技巧总结
  • 原文地址:https://www.cnblogs.com/Lis-/p/13812553.html
Copyright © 2011-2022 走看看