mysql性能优化(一)

MySQL里面的所分为表锁和行锁不同存储引擎它的锁也不一样,Innodb有表锁和行锁,而mysiam只有表锁

具体的操作验证Innodb的(索引字段)行锁

1.set autocommit=0 取消自动提交
2.使用A,B两个窗口分别update同一行数据,过滤条件必须是索引,因为索引是行锁,非索引是表锁
在这里插入图片描述
在这里插入图片描述
A窗口先update数据,B窗口后update数据,发现B阻塞了
然后使用A,B窗口update不同索引行的数据】
在这里插入图片描述
在这里插入图片描述
不同行不会被阻塞,说明Innodb下的索引锁的是行锁,当一个事务持有这一行的锁时,其他的事务需要等待

验证Innodb下,非索引字段使用的表锁

在这里插入图片描述

在这里插入图片描述
A窗口我是根据name这个非索引字段进行update操作的,有余他是表锁,当B窗口根据ID进行update操作的时候,倍阻塞掉了

总结:在Innodb下,索引字段使用的行锁,非索引字段使用的表锁,而mysiam都是使用表锁

比较行锁和表锁

1.行锁:
优点:行锁颗粒度细
缺点:获取,释放工作多,
容易发生死锁:
在这里插入图片描述
实现Innodb

共享锁:read,可以并行
独占锁:write,要等一个事务结束之后,下一个事务才可以进行
间隙锁:一个索引的范围锁
锁的优化
在这里插入图片描述
注意点:要commit之后,update才生效的
表级锁的争用状态变量
show status like ‘table%’;
行级锁争用状态变量
show status like ‘innodbrowlock%’;

分析sql:简单使用explain

在这里插入图片描述
说明一下返回的各个信息:
在这里插入图片描述

在这里插入图片描述

依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,uniquesubquery,indexsubquery,range,indexmerge,index,all
我们比较关注度信息:
在这里插入图片描述

mysql的事务隔离级别

1.Read uncommitted(读取未提交)
在这里插入图片描述
事务A读取到了事务B没有提交的数据,那就是脏读了
读取未提交可能出现:1.脏读,2.不可重复读,3.幻读

2.Read committed(读取提交)
在这里插入图片描述
关键:A事务读取到的是其他线程commit后的最新的数据
当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。
读取未提交可能出现:2.不可重复读,3.幻读

3.Repeatable read(可重复读)
在这里插入图片描述
关键:A事务读取数据,没有commit,期间就算有其他事务修改了数据,并且commit了,他也不会获取到修改后的数据。
读取未提交可能出现:3.幻读
Mysql的默认隔离级别就是Repeatable read

4.Serializable(串行)
Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。(一次只执行一个事务)

猜你喜欢

转载自blog.csdn.net/sinat_30594513/article/details/88766346