MySQL的锁


按照颗粒度分:

  • 全局锁:锁整个database,由MySQL的SQL Layer层(核心服务层)实现。
  • 表级锁:锁某个table,由MySQL的SQL Layer层实现。
    • 自增锁(AUTO-INC LOCK)
  • 行级锁:锁某Row的索引,也可锁定行索引之间的间隙,由存储引擎实现【InnoDB】
    • 记录锁(Record Locks):锁定索引中的一条记录
    • 间隙锁(Gap Locks):要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值。
    • 临键锁(Next-Key Locks):是索引记录上的记录锁和在索引记录之间的间隙锁的组合(间隙锁+记录锁)
    • 插入意向锁(Insert Intention Locks):做insert操作时添加的对记录ID的锁,不同的插入意向锁不互斥,但是对其他的锁互斥


按锁功能分

  • 共享锁Shared Lock(S锁,也叫做读锁)
    • 加了读锁的记录,允许其他事务再加读锁
    • 加锁方式:select … lock in share mode
  • 排它锁Exclusive Lock(X锁,也叫写锁)
    • 加了写锁的记录,不允许其他事务再加读锁或者写锁
    • 加锁方式:select … for update

explain字段的说明

type

这个字段是我们优化要重点关注的字段,这个字段直接反映我们SQL的性能是否高效。

这个字段值较多,这里我只重点关注我们开发中经常用到的几个字段:system,const,eq_ref,ref,range,index,all;
性能由好到差依次为:==system>const>eq_ref>ref>range>index>all==(一定要牢记)

  • system:表只有一行记录,这个是const的特例,一般不会出现,可以忽略
  • const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快。
  • eq_ref:唯一性索引扫描,表中只有一条记录与之匹配。一般是两表关联,关联条件中的字段是主键或唯一索引。
  • ref:非唯一行索引扫描,返回匹配某个单独值的所有行
  • range:检索给定范围的行,一般条件查询中出现了>、<、in、between等查询
  • index:遍历索引树。通常比ALL快,因为索引文件通常比数据文件小。all和index都是读全表,但index是从索引中检索的,而all是从硬盘中检索的。
  • all:遍历全表以找到匹配的行

参考文章:

1、https://blog.csdn.net/shark_chili3007/article/details/108089396

2、https://juejin.cn/post/7368375416929239092?searchId=202408141914405888882B1A217C964C98


文章作者: 王利康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王利康 !
  目录