MySQL的隔离级别是什么

关注微信公众号【八戒程序猿】,回复“001208” , 免费获取一套让你少花时间,少走弯路,mysq的l架构教程

为什么会有隔离级别

数据库并发会带来脏读、不可重复读、幻读等问题,所以采用了事物的隔离级别来解决。

先来看看脏读、不可重复读、幻读什么意思?
• 脏读:事物A读取了事物B未提交的数据。
• 不可重复读:事物A同样的查询条件,查询多次,读出的数据不一样,不一样的侧重点在于 update和delete
• 幻读:事物A同样的查询条件,查询多次,读出的数据不一样,不一样的侧重点在于insert

数据库隔离级别

  • 读未提交

不解决脏读、不可重复读、幻读的问题,对所有的数据都不加任何的锁。

  • 读已提交

不解决不可重复读、幻读问题,但解决了脏读问题,会读取已提交的数据。它读取数据的时候是不加锁的,只有在更新的时候才会加入行锁操作,但如果更新的条件字段没有索引将会锁整张表(实际上MySQL做了一层优化,过滤时发现不满足条件的数据会释放锁)

  • 可重复读

不解决幻读问题,但解决了脏读、不可重复读问题,其实在MySQL中 该隔离级别也已经解决了幻读的问题。

  • 串行化

解决并发事物带来的所有问题。通过读加共享锁,写加排它锁进行控制,读写互斥,悲观锁理论。

MySQL可重复读如何解决不可重复读、幻读的?

不可重复读、幻读出现的场景为以下两种

  1. 事物A读取数据,而事物B做写操作,这种属于快照读的场景。
  2. 事物A和事物B都进行写的操作,这种属于当前读的场景。
快照读的场景如何解决的呢?

MySQL引入事物版本号的概念,每条数据都会有隐藏的一个事物版本号字段。每开启一个事物,事物版本号都会递增。查询数据的时候都会读取数据库中数据版本号 <= 当前事物版本号的数据(开启事务那刻读取的事物版本号),更新数据的时候会将此次递增的事物版本号写入。

当前读的场景如何解决的呢?

表中会建立索引列,进行 upate table set field = ? where 索引列=? 时会采用行锁,锁住该行,防止其他事务修改。 如果update 语句的条件为范围条件,而不是相等条件时mysql 则会采用gap锁,锁住符合条件的数据,比如 索引列> 10 and 索引列 < 20 的数据,防止其他事务修改。但gap锁会带来一定的问题,因为如果锁住了条件范围内不存在的记录,会导致其他事务暂时不能插入数据。

  1. 如果没有建立索引列,进行更新的时候会锁住整张表
  2. 如果对索引列进行类型转换或者自动类型转换,也会锁住整张表

SQL优化

  1. 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配 比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)顺序的索引,d是用不到索引的,因为c>3这个条件是一个范围条件,那么只能取索引树中符合这个条件的所有节点出来然后在去过滤d的条件,显然d条件的过滤并不是走索引树了。如果建立(a,b,d,c)的索引则都可以用到, 因为MySQL会根据复合索引列的顺序,自动调整SQL条件,会调整为 a=1 and b=2 and d=4 and c>3。详细规则可以看看下表(建立了 a,b,c 复合索引)
  2. 索引列不能参与计算
  3. 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可
  4. 尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,比如唯一键的区分度是1
  5. 通过explain执行计划做分析
  6. 对于连表查询,left join 的关键字,右表建立索引字段是关键,因为left join 已经确定左表的数据都有
    主要关注type、key、rows、id字段

type:为查询数据的访问类型,主要有这几种 : all < index < range < ref < ref_eq < const ,从 左往右 效率依次递增的。

all 全表扫描
index 全表扫描,只不过扫描的是索引树
range 有范围的索引扫描
ref 使用了索引,但索引列的值并不是唯一的。
ref_eq 它知道这种类型的查找结果集只有一个
const  通过索引一次就找到了,如:将表的主键ID置于where条件中。

key:为实际使用到的索引
rows:字段为找到所需记录实际需要读取的行数
id:表的执行顺序,ID值越大优先级越高,相同的按排列顺序

关注微信公众号【八戒程序猿】,回复“001208” , 免费获取一套让你少花时间,少走弯路,mysql架构教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值