使用方式
MYSQL 的 SHOW STATUS 命令会返回一些计数器,既有服务器级别的全局计数器,也有基于某个连接的会话级别的计数器,这在定位一些性能问题时时很好用的一个小工具,不过 SHOW STATUS 返回的只是一些计数,并且还是只读的,并不会剖析性能,所以需要在具体的业务场景下结合一些信息去定位问题,比如可以查询 Queries 总共执行了多少次查询。
SHOW STATUS 会返回一张临时表,这张表中有很多参数,一些参数并不是我们想要看的,所以要结合 where 条件来过滤一下,比如 统计一下总共 执行了多少查询
mysql> show status where Variable_name like 'Queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Queries | 65213 |
+---------------+-------+
1 row in set (0.00 sec)
以下是一些常见的观测值
统计线程和连接
有些时候,需要定位一下目前的线程使用情况以及连接情况来分析问题,便可以观察这些计数器,比如查看线程的使用情况,查看慢查询,查看拒绝的连接,查看连接数等一些信息
show status where Variable_name like 'Connections'
or Variable_name like 'Max_used_connections'
or Variable_name like 'Threads%'
or Variable_name like 'Slow%'
or Variable_name like 'Aborted%';
- Aborted_clients 连接的应用错误
- Aborted_connects 拒绝的连接数量
- Connections 连接数
- Max_used_connections 最大使用的连接数
- Slow_launch_threads 慢线程数
- Slow_queries 慢查询数
- Threads_cached 缓存线程数
- Threads_connected 线程连接
- Threads_created 创建的线程
- Threads_running 运行的线程
如果 Aborted_connects 不为0,可能意味着网络有问题或某人尝试连接但失败,这个值如果太高,可能就会有mysql阻塞的风险,所以这个值可以参考一下在某些特殊的场景下,比如有表锁导致大量的连接被占用释放不了,然后 Connections 连接数太高连接被耗尽。
Threads_running 运行的线程数量,这个值太高证明当前mysql的负载有问题或者是连接太多或者是有坏的sql导致查询太多处理不过来。
查看二进制日志状态
show status where Variable_name like 'Binlog%';
- Binlog_cache_disk_use 有多少事务因超过二进制日志缓存大小被存储到一个临时文件中
- Binlog_cache_use 在二进制日志缓存中有多少事务被存储过
命令发起的次数统计
show status where Variable_name like 'Com_%';
- Com_select 统计 SELECT 语句的数量
- Questions 统计总查询量和服务器收到的命令数。
Com_ 相关的表可以统计的信息是非常多的,这里只是举了几个比较常用关心的地方,使用这个可以很直观的看到当前 Mysql 的一些命令的使用情况,可以查看 select 语句命令的使用。
统计创建的临时文件和临时表
show status where Variable_name like 'Created%';
- Created_tmp_tables 创建的临时表,如果一个查询创建的临时表太多也是一个坏事情
- Created_tmp_files 创建的临时文件
查询过程中临时表太多也是一个性能损耗比较严重的问题,这个时候可能需要优化一下的你的SQL查询,是否使用了内联查询等关联查询。
统计查询的一些状态信息
show status where Variable_name like 'Select%';
- Select_full_join
- Select_full_range_join
- Select_range 查询时是否走了索引或者是可用的索引条数
- Select_range_check 关联查询时可用的索引数目,如果没有,那么查询的开销会非常大
- Select_scan 整表扫描,如果索引设计不好导致整表扫描次数有些多,是个灾难