MYSQL InnoDB的索引和锁

原创
2016/05/24 21:50
阅读数 112

备注:X锁是排它锁(写锁),S锁是共享锁(读锁)

mysql中每个表都有一个聚簇索引(clustered index ),
除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes)。

以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果您的表上定义有主键,该主键索引是聚集索引。
如果你不定义为您的表的主键时,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚集索引。
如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。

delete from t1 where id = 10;

  1. MYSQL的InnoDB中加锁,锁的是数据表中记录的索引

2.id不是主键,而是一个Unique的二级索引键值,name是主键。那么在RC隔离级别下,delete from t1 where id = 10; a.delete会走id的唯一索引,首先会锁定 id=10的记录上加X锁, b.并且会找到id=10的记录上所对应的name(主键)加上x锁。

试想一下,如果并发的一个SQL,是通过主键索引来更新:update t1 set id = 100 where name = ‘d’; 
此时,如果delete语句没有将主键索引上的记录加锁,那么并发的update就会感知不到delete语句的存在,
违背了同一记录上的更新/删除需要串行执行的约束。

3.id不是主键,而是一个普通的索引,name是主键 a.delete会走id的唯一索引,首先会锁定 id=10的所有记录上加X锁, b.并且会找到id=10的所有记录上所对应的name(主键)加上x锁。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
2
分享
返回顶部
顶部