MySQLLelove 2019-06-25
一般一个程序满,从消耗的角度,一个是cpu,一个是IO,但有的时候mysql慢,是因为某条sql不小心把整个表给锁了。
锁是计算机协调多个进程或线程并发访问某一资源的机制。
在数据库中,除了传统的计算机资源(如CPU,RAM,I/O)的争用外,数据也是供很多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
从对数据操作的类型:分为读锁/写锁
从对数据操作的粒度:分为表锁/行锁
1.特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
2.案例分析:
3.案例总结
MyISAM在执行查询语句之前,会自动给所涉及的表加读锁,在执行增改删操作前,会自动给涉及的表加写锁
MyISAM表级锁有两种模式:
结论:
简而言之就是,读锁会阻塞写,但不会阻塞读,而写锁会阻塞读和写
4.表锁分析,如何排查锁的情况
看看哪些表被锁了:show open tables;
如何分析表锁定:可以通过table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定
SQL:show status like 'table%';
另外,MyISAM的读写锁调度是写优先,这也是MyISAM不适合做写为主表的引擎。因为写锁后,其它线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞
1.特点:偏向InnoDB存储引擎,开销大,加锁慢,有死锁,锁定力度小,发生锁冲突的概率最低,并发度也最高
InnoDB与MyISAM两者的不同:一是支持事务,而是采用了行级锁
2.并发事务处理带来的问题
3.事务的隔离级别
4.案例分析
5.无索引行锁升级为表锁
6.间隙锁的危害
7.分析行锁定
通过检查InnoDB_row_lock状态变量来分析系统上的行锁争夺情况
show status like 'innodb_row_lock%';
8.优化建议