前言
换了工作之后,接近半年没有发博客了(一直加班),emmmm…..今天好不容易有时间,记录下工作中遇到的一些问题,接下来应该重拾知识点了。因为新公司工作中MySQL库经常出现查询慢,锁等待,节点挂掉……..等一系列问题。导致每个程序员头都很大,一味抱怨“为什么我就查一条数据这么卡”,”我TM加了索引的啊,怎么还怎么慢“………..我想默默说的是,大部分MySQL出现锁等待,查询奇慢的情况基本都是因为SQL写的不好(有坑),或者数据表设计的不完善。对,不用想!这些所有的坑很大一部分都是自己造成的。那么是什么原因造成的,大部分只是抱怨,而不去关注MySQL的一些细节问题,比如:MySQL行锁的细节,什么情况下会使用表锁等。所以今天先讨论记录下InnoDB特有的行锁的一些细节,加强认识。
InnoDB不同于MyISAM最大的两个特点就是:一是支持事务,二是支持行锁;毋庸置疑,因为这两个特性大部分都采用InnoDB引擎,其中的支持行锁就是InnoDB适合多并发优势所在,但是行锁的一些细节没有深入理解过的话,可能会造成一定的误解,造成“看似命中索引,走行锁,结果却是表锁,最终导致锁等待情况”。
一、InnoDB行锁的实现方式
通过给索引上的索引项加锁来实现的,也就意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。这一点在实际应用中特别需要注意,不然的话可能导致大量的锁冲突,从而影响引发并发性能。
实验一:对没有索引的加锁,导致表锁
1)准备工作:建tab_no_index表,表中无任何索引,并插入数据