MySQL的锁分析

首先,我就先假设读者们都是了解数据库隔离级别的人,对所谓的RR,RC,RU,Serializable都是耳熟能详的。 如果不明白,可以看看这几篇文章,写的都很清楚,详细。 数据库隔离级别 乐观锁和悲观锁 但是,知道了这些概念,我们怎么去优化我们的SQL语句呢。其实还有一小段路。 比如说,现在有这么两个SQL语句: select * from t1 where id = 10; delete from t1 where id = 10 MySQL会采用什么样的方式进行加锁处理,加什么样的锁? 某种情况下,这个问题可以这么回答: 对于SQL1,MySQL不进行加锁处理,因为有MVCC的存在。 对于SQL2,对id等于10的记录进行加锁处理(主键索引)。 但是,这个答案是有前提的,比如说,id是不是主键? 当前系统的隔离级别是什么? id上有没有索引? 抑或是SQL的执行计划是什么,全盘扫描还是索引扫描? 等等。。都是需要考虑的,没有这些前提,这个SQL的执行结果就无法预知。 我们就来假设几种情况: 1. id为主键,RC隔离级别 这个组合最简单,因为id主键,所以对于给定的 delete from t1 where d=10 语句, 我们只要给id=10的记录加上X锁即可。 2. id为二级索引,RC隔离级别 何为二级索引,我们都知道mysql中每个表都有一个聚簇索引(clustered index ), 除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes). 仅仅对于InnoDB来说,每个表都有一个特殊的索引称为聚集索引。 如果您的表上定义有主键,该主键索引是聚集索引。如果你不定义为您的表的主键时, MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键, InnoDB使用它作为聚集索引。如果没有这样的列,InnoDB就自己产生一个这样的ID值, 它有六个字节,而且是隐藏的,使其作为聚簇索引。 聚簇索引主要是为了方便存储。。所以二级索引,是对聚簇索引的索引。…