辅助命令
- SHOW VARIABLES
- show table
- show profiles
进行分析需要先了解mysql运行情况,一般使用show status 分析sql运行状态。
table_locks 分析
innodb 和MyISAM都实现了表锁,表锁包括表共享读锁(Table Read Lock)和表独占写锁。MyISAM在执行查询语句前,会自动给相关的表加读锁,在执行更新操作的前,会自动给相关的表加写锁;自动加锁时,MyISAM总是一次获得sql语句相关表的全部锁,这也是MyISAM表不会出现死锁的原因。
查看表锁状态
如果table_locks_waited值较高,且存在性能问题,则说明存在着较严重的表级锁争用情况。
输出结果如下
参数 | 统计结果 | 描述 |
---|---|---|
Table_locks_immediate | 4058 | 表示立即释放表锁数 |
Table_locks_waited | 0 | 表示需要等待的表锁数 |
如果table_locks_waited值较高,且存在性能问题,则说明存在着较严重的表级锁争用情况。
- infodb 、myisam 都支持表锁
Innodb_row_lock 分析
innodb实现了行数,InnoDB行锁实现是通过索引上的索引项加锁实现的,意味着:只有通过索引条件检索数据,InnoDB才会使用行锁,否则使用表锁。
SHOW STATUS WHERE variable_name LIKE '%row_lock%';
Variable_name | Value | 描述 |
---|---|---|
Innodb_row_lock_current_waits | 0 | 当前锁等待的数量 |
Innodb_row_lock_time | 1411838 | 自系统启动到现在,锁定的总时间,单位:毫秒 ms。 |
Innodb_row_lock_time_avg | 1173 | 平均锁定的时间,单位:毫秒 ms |
Innodb_row_lock_time_max | 51614 | 最大锁定时间,单位:毫秒 |
Innodb_row_lock_waits | 1203 | 自系统启动到现在,锁等待次数,即锁定的总次数。 |
输出结果中 Innodb_row_lock_waits 有1203次,表示发生了1203锁等待事件。平均锁定时间 1173 ms。合计锁定时间有 1411秒。
table cache
Mysql在使用独立表空间时,可以通过 table cache机制来优化表加载机制。可以使用如下命令查询当前是否使用独立表空间:
show variables like '%per_table%';
table cache 使用实际情况查询方式:
SHOW GLOBAL STATUS WHERE variable_name LIKE '%table_open%' OR variable_name LIKE 'open%tables';
输出:
Variable_name | Value | 描述 |
---|---|---|
Variable_name | Value | |
Open_tables | 2000 | 打开后在缓存中的表数量 < table_open_cache |
Opened_tables | 38867830 | 打开的所有表数量 |
Table_open_cache_hits | 244113301 | |
Table_open_cache_misses | 38867347 | |
Table_open_cache_overflows | 38850842 |
- 查看 时间打开的表空间
SHOW OPEN TABLES
- 缓存表配置查询
SHOW GLOBAL VARIABLES LIKE 'table_open_cache';
数据缓存
- innodb_buffer_pool_size
网友评论