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,
我们比较关注度信息: