zoukankan      html  css  js  c++  java
  • 查看Mysql正在执行的事务、锁、等待

    一、关于锁的三张表(MEMORY引擎)

    ## 当前运行的所有事务
    mysql> select * from information_schema.innodb_trxG;
    *************************** 1. row ***************************
                        trx_id: 613963
                     trx_state: LOCK WAIT                  #事务状态
                   trx_started: 2019-02-22 10:48:48
         trx_requested_lock_id: 613963:460:3:4
              trx_wait_started: 2019-02-22 11:08:41
                    trx_weight: 2
           trx_mysql_thread_id: 140
                     trx_query: update tx1 set c1='heyfffff',c2='heyffffff' where id =3
           trx_operation_state: starting index read
             trx_tables_in_use: 1
             trx_tables_locked: 1
              trx_lock_structs: 2
         trx_lock_memory_bytes: 1136
               trx_rows_locked: 7                          #事务锁住的行数
             trx_rows_modified: 0
       trx_concurrency_tickets: 0                          #事务并发票数    
           trx_isolation_level: REPEATABLE READ
             trx_unique_checks: 1
        trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
     trx_adaptive_hash_latched: 0
     trx_adaptive_hash_timeout: 0
              trx_is_read_only: 0
    trx_autocommit_non_locking: 0
    *************************** 2. row ***************************
                        trx_id: 613962
                     trx_state: RUNNING
                   trx_started: 2019-02-22 10:46:29
         trx_requested_lock_id: NULL
              trx_wait_started: NULL
                    trx_weight: 3
           trx_mysql_thread_id: 138
                     trx_query: select * from information_schema.innodb_trx
           trx_operation_state: NULL
             trx_tables_in_use: 0
             trx_tables_locked: 1
              trx_lock_structs: 2
         trx_lock_memory_bytes: 1136
               trx_rows_locked: 1
             trx_rows_modified: 1
       trx_concurrency_tickets: 0
           trx_isolation_level: REPEATABLE READ
             trx_unique_checks: 1
        trx_foreign_key_checks: 1
    trx_last_foreign_key_error: NULL
     trx_adaptive_hash_latched: 0
     trx_adaptive_hash_timeout: 0
              trx_is_read_only: 0
    trx_autocommit_non_locking: 0
    2 rows in set (0.00 sec)
    
    ## 当前出现的锁
    mysql> select * from information_schema.innodb_locksG;
    *************************** 1. row ***************************
        lock_id: 613963:460:3:4
    lock_trx_id: 613963
      lock_mode: X
      lock_type: RECORD
     lock_table: `test`.`tx1`
     lock_index: PRIMARY
     lock_space: 460
      lock_page: 3
       lock_rec: 4
      lock_data: 3
    *************************** 2. row ***************************
        lock_id: 613962:460:3:4
    lock_trx_id: 613962
      lock_mode: X
      lock_type: RECORD
     lock_table: `test`.`tx1`
     lock_index: PRIMARY
     lock_space: 460
      lock_page: 3
       lock_rec: 4
      lock_data: 3
    2 rows in set, 1 warning (0.00 sec)
    
    ## 锁等待的对应关系 
    mysql> select * from information_schema.innodb_lock_waitsG;
    *************************** 1. row ***************************
    requesting_trx_id: 613963             
    requested_lock_id: 613963:460:3:4         #请求锁的锁ID
      blocking_trx_id: 613962                 #当前拥有锁的事务ID
     blocking_lock_id: 613962:460:3:4
    1 row in set, 1 warning (0.00 sec)

    二、查看锁的情况

    mysql> show status like 'innodb_row_lock_%';
    +-------------------------------+--------+
    | Variable_name                 | Value  |
    +-------------------------------+--------+
    | Innodb_row_lock_current_waits | 1      |
    | Innodb_row_lock_time          | 479764 |
    | Innodb_row_lock_time_avg      | 39980  |
    | Innodb_row_lock_time_max      | 51021  |
    | Innodb_row_lock_waits         | 12     |
    +-------------------------------+--------+
    5 rows in set (0.00 sec)
    
    解释如下:
    Innodb_row_lock_current_waits : 当前等待锁的数量
    Innodb_row_lock_time : 系统启动到现在,锁定的总时间长度
    Innodb_row_lock_time_avg : 每次平均锁定的时间
    Innodb_row_lock_time_max : 最长一次锁定时间
    Innodb_row_lock_waits : 系统启动到现在总共锁定的次数  
    
    
    
    # 查询是否锁表
    mysql> show OPEN TABLES where In_use > 0;
    +----------+-------+--------+-------------+
    | Database | Table | In_use | Name_locked |
    +----------+-------+--------+-------------+
    | test     | tx1   |      1 |           0 |
    +----------+-------+--------+-------------+
    1 row in set (0.00 sec)

    三、杀死进程

    # 1.查询进程
    mysql> show processlistG                   # G 结构旋转90度变成纵向
    *************************** 1. row ***************************
         Id: 138
       User: root
       Host: localhost:55106
         db: test
    Command: Query
       Time: 0
      State: starting
       Info: show processlist
    *************************** 2. row ***************************
         Id: 140
       User: root
       Host: localhost:56158
         db: test
    Command: Sleep   # 正在等待客户端向它发送执行语句
       Time: 145
      State:
       Info: NULL
    2 rows in set (0.00 sec)
    
    # 2.杀死对应进程ID 
    mysql> kill 140;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show processlistG
    *************************** 1. row ***************************
         Id: 138
       User: root
       Host: localhost:55106
         db: test
    Command: Query             #该线程正在执行一个语句            Sleep:线程正在等待客户端向其发送新的语句。
       Time: 0
      State: starting
       Info: show processlist
    1 row in set (0.00 sec)

    四、SQL分析

    explain使用方法

    EXPLAIN命令,用于显示SQL语句的查询执行计划。EXPLAIN为用于SELECT语句中的每个表返回一行信息。

        EXPLAIN EXTENDED命令:显示SQL语句的详细的查询执行计划;之后可以通过"SHOW WARNINGS"命令查看详细信息。
        SHOW WARNINGS命令:可以查看MySQL优化器优化后的SQL语句。
    
        EXPLAIN PARTITIONS命令:显示SQL语句的带有分区表信息的查询执行计划。
        EXPLAIN命令的输出格式:
          TRADITIONAL:传统类型,按行隔离,每行标识一个自操作。
          JSON:JSON格式。

    使用方法为在SQL语句前加explain

    得到结果如下:

    1.  
      mysql> explain select id,c1 from t1 where c1=4398825;
    2.  
      +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
    3.  
      | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    4.  
      +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
    5.  
      | 1 | SIMPLE | t1 | ALL | NULL | NULL | NULL | NULL | 4992210 | Using where |
    6.  
      +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+
    7.  
      1 row in set (0.00 sec)

    各列功能如下:

    • id: 按照sql语法解析后分层后的编号,可能重复

    • select_type:

      • SIMPLE,简单的select查询,不使用union及子查询

      • PRIMARY,最外层的select查询

      • UNION,UNION 中的第二个或随后的 select 查询,不依赖于外部查询的结果集

      • DEPENDENT UNION,UNION 中的第二个或随后的 select 查询,依赖于外部查询的结果集

      • SUBQUERY,子查询中的第一个 select 查询,不依赖于外部查询的结果集

      • DEPENDENT SUBQUERY,子查询中的第一个 select 查询,依赖于外部查询的结果集

      • DERIVED,用于 from子句里有子查询的情况。 MySQL会递归执行这些子查询, 把结果放在临时表里。

      • UNCACHEABLE SUBQUERY,结果集不能被缓存的子查询,必须重新为外层查询的每一行进行评估。

      • UNCACHEABLE UNION,UNION 中的第二个或随后的 select 查询,属于不可缓存的子查询

    • table:涉及的表,如果SQL中表有赋别名,这里出现的是别名

    • type:

      • system,从系统表读一行。这是const联接类型的一个特例。

      • const,表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!

      • eq_ref,查询条件为等于

      • ref,条件查询不等于

      • ref_or_null,同ref(条件查询),包含NULL值的行。

      • index_merge,索引联合查询

      • unique_subquery,利用唯一索引进行子查询

      • index_subquery,用非唯一索引进行子查询

      • range,索引范围扫描

      • index,索引全扫描

      • ALL,全表扫描。

    • possible_keys:可能使用的索引

    • key:sql中使用的索引

    • key_len:索引长度

    • ref:使用哪个列或常数与key一起从表中选择行。

    • rows:显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

    • Extra:该列包含MySQL解决查询的详细信息。

      • Distinct,去重,返回第一个满足条件的值

      • Not exists 使用not exists查询

      • Range checked for each record,有索引,但索引选择率很低

      • Using filesort,有序查询

      • Using index,索引全扫描

      • Using index condition,索引查询

      • Using temporary,临表表检索

      • Using where,where条件查询

      • Using sort_union,有序合并查询

      • Using union,合并查询

      • Using intersect,索引交叉合并

      • Impossible WHERE noticed after reading const tables,读取const tables,查询结果为空

      • No tables used,没有使用表

      • Using join buffer (Block Nested Loop),使用join buffer(BNL算法)

      • Using MRR(Multi-Range Read ) 使用辅助索引进行多范围读

    五、数据库的一些默认设置

    # 查看数据库默认存储引擎
    mysql> show engines; 
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.00 sec)
    
    # 查看当前数据库默认隔离级别
    mysql> select @@global.tx_isolation; 
    +-----------------------+
    | @@global.tx_isolation |
    +-----------------------+
    | REPEATABLE-READ       |
    +-----------------------+
    1 row in set, 1 warning (0.00 sec)
    
    # 默认自动提交事务
    mysql> show global variables like 'autocommit';  
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | autocommit    | ON    |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    mysql> select @@global.autocommit;
    +---------------------+
    | @@global.autocommit |
    +---------------------+
    |                   1 |
    +---------------------+
    1 row in set (0.00 sec)

    转载于:https://my.oschina.net/wuweixiang/blog/3013479

  • 相关阅读:
    Azure PowerShell (2) 修改Azure订阅名称
    Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户
    Azure PowerShell (3) 上传证书
    Azure PowerShell (1) PowerShell入门
    Windows Azure Service Bus (2) 队列(Queue)入门
    Windows Azure Service Bus (1) 基础
    Windows Azure Cloud Service (10) Role的生命周期
    Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
    Android studio 使用心得(一)—android studio快速掌握快捷键
    android 签名、混淆打包
  • 原文地址:https://www.cnblogs.com/fengff/p/13607355.html
Copyright © 2011-2022 走看看