MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选( 二 )


lock_data
当 LOCK_TYPE为RECORD时,表示锁定记录行的主键
MySQL系统数据库information_schema的innodb_lock_waits表中记录了innodb数据库引擎当前运行的数据库事务等待锁的情况,innodb_lock_waits表中包含的常用字段说明如表所示 。本文作者:张永清, 转载请注明: https://www.cnblogs.com/laoqing/p/16880718.html  来源于博客园 ,本文摘选自《软件性能测试分析与调优实践之路》
表innodb_lock_waits表中包含的常用字段说明
字段
描述
requesting_trx_id
请求事务的 ID
Requested_lock_id
事务所等待的锁定的 ID 。可以和 INNODB_LOCKS 表关联查询
Blocking_trx_id
阻塞事务的 ID
Blocking_lock_id
阻塞了另一事务的运行的事务的锁的 ID
在数据库中出现死锁时,经常需要通过查询innodb_trx、innodb_locks、innodb_lock_waits这三张表来找出在执行什么事务操作时导致了死锁 , 例如执行如下SQL可以列出数据库中所有事务的等待和锁定记录 。
--本文作者:张永清, 转载请注明: https://www.cnblogs.com/laoqing/p/16880718.html  --来源于博客园 ,本文摘选自《软件性能测试分析与调优实践之路》SELECTr.trx_isolation_level,/*事务隔离级别*/r.trx_id AS waiting_trx_id,/*正处于等待中的事务id*/r.trx_mysql_thread_id AS waiting_trx_thread, /*正处于等待中的数据库线程id*/r.trx_state AS waiting_trx_state, /*正处于等待中的事务的状态*/lr.lock_mode AS waiting_trx_lock_mode,/*正处于等待中的事务的锁定模式*/lr.lock_type AS waiting_trx_lock_type,/*正处于等待中的事务的锁定类型*/lr.lock_table AS waiting_trx_lock_table,/*正处于等待中的事务将锁定的表*/lr.lock_index AS waiting_trx_lock_index,/*正处于等待中的事务将锁定的索引*/r.trx_query AS waiting_trx_SQL,/*正处于等待中的事务将执行的SQL*/b.trx_id AS blocking_trx_id,/*正处于锁定中的事务id*/b.trx_mysql_thread_id AS blocking_trx_thread,/*正处于锁定中的线程id*/b.trx_state AS blocking_trx_state,/*正处于锁定中的事务的状态*/lb.lock_mode AS blocking_trx_lock_mode,/*正处于锁定中的事务的锁定模式*/lb.lock_type AS blocking_trx_lock_type,/*正处于锁定中的事务的锁定类型*/lb.lock_table AS blocking_trx_lock_table,/*正处于锁定中的事务已经锁定的表*/lb.lock_index AS blocking_trx_lock_index,/*正处于锁定中的事务已经锁定的索引*/b.trx_query AS blocking_sql /*正处于锁定中的事务在执行的SQL*/FROMinformation_schema.innodb_lock_waits wtINNER JOIN information_schema.innodb_trx bON b.trx_id = wt.blocking_trx_idINNER JOIN information_schema.innodb_trx rON r.trx_id = wt.requesting_trx_idINNER JOIN information_schema.innodb_locks lbON lb.lock_trx_id = wt.blocking_trx_idINNER JOIN information_schema.innodb_locks lrON lr.lock_trx_id = wt.requesting_trx_id;1.3、MySQL中数据库表的监控

  • 1、查看数据库中当前打开了哪些表: show OPEN TABLES ,如图所示 。另外还可以通过show OPEN TABLES where In_use > 0过滤出当前已经被锁定的表 。

MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选

文章插图
  • 2、查看数据库中表的状态:SHOW STATUS LIKE  '%table%',如图所示 。需要特别注意的是Table_locks_waited  指的是不能立即获取表级锁而需要等待的次数,如果等待的次数非常大则说明可能存在锁争抢的情况,如果是频繁的出现锁争抢则对应用程序的并发性能影响很大 。

MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选

文章插图
  • 3、查看数据库中锁的信息:SHOW STATUS LIKE '%lock%',如图所示 。

MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选

文章插图
  • 4、查看数据库中的表被扫描的情况:show global status like 'handler_read%',如图所示,查询的结果数据也可以用来评估数据库中索引的使用情况 。查询的结果数据说明如表所示 。

MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选

文章插图
查询结果项
描述
Handler_read_first
从索引中读取第一项的次数,如果该值非常高,表明服务器正在执行大量的全索引扫描,该值一般不宜太高
Handler_read_key
基于键读取数据行的请求数,该值如果越高则表明大量的查询都走了索引 。如果越低,表示索引的利用很低,该值一般越高越好
Handler_read_last
读取索引中最后一个键的请求数
Handler_read_next
按键顺序读取下一行的请求数,如果查询都走了索引,那么该值将不断递增
Handler_read_prev
按键顺序读取前一行的请求数(倒序读取数据),一般用于评估执行ORDER BY … DESC的次数

推荐阅读