一 点睛
InnoDB 存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定更高一些,但是在整体并发处理能力方面远远优于 MyISAM 的表级锁定。当系统并发量比较高的时候,Innodb 的整体性能和 MyISAM 相比就会有比较明显的优势了。
但是,InnoDB 的行级锁定同样也有比较脆弱的一面,当我们使用不当的时候,可能会让 InnoDB 的整体性能表现不仅不能比 MyISAM 高,甚至可能会更差。
二 行锁分析
通过检查 innodb_row_lock 状态变量来分析系统上行锁的争夺情况。
mysql> show status like 'innodb_row_lock%';
+-------------------------------+--------+
| Variable_name | Value |
+-------------------------------+--------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 235258 |
| Innodb_row_lock_time_avg | 26139 |
| Innodb_row_lock_time_max | 51423 |
| Innodb_row_lock_waits | 9 |
+-------------------------------+--------+
5 rows in set (0.00 sec)
对各个状态量的说明
- Innodb_row_lock_current_waits:当前正在等待锁定的数量。
- Innodb_row_lock_waits:从系统启动到现在锁定总时间长度。
- Innodb_row_lock_time_avg:每次等待所花平均时间。
- Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间。
- Innodb_row_lock_waits:从系统启动到现在总共等待的次数。
这5个参数中比较重要的三个参数是:
- Innodb_row_lock_current_waits
- Innodb_row_lock_time_avg
- Innodb_row_lock_waits
尤其是当等待次数很高时,而且每次等待时长也不小的时候,就需要分析系统中为什么会有如此之多的等待,然后根据分析结果着手优化。
用 show profiles 进行分析。
三 优化建议