锁
按照颗粒度分:
- 全局锁:锁整个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