文章目录
- 一、练习题目
- 二、SQL思路
- SQL进阶-查询优化- SHOW STATUS
- 初始化数据
- 解法
- SHOW STATUS是什么
- 实战经验:常用的mysql状态查询
- 1、QPS(每秒处理的请求数量)
- 计算思路:
- Questions和 Queries的区别
- 2、TPS(每秒处理的事务数量)
- 计算思路:
- 3、key Buffer 命中率
- 4、InnoDB Buffer命中率
- 5、query cache命中率
- 6 、table_cache(table_open_cache) 命中率
- 6、thread cache命中率
- 优化
- 7、tmp table相关状况分析
- 8、binlog cache
- 9、innodb_log_waits
- 10、锁状态
- 三、总结
- 四、参考
- 五、粉丝福利
- 福利0
- 福利1
- 福利2
一、练习题目
题目链接
难度
SQL进阶-查询优化- SHOW STATUS
★★★☆☆
二、SQL思路
SQL进阶-查询优化- SHOW STATUS
初始化数据
这里写入初始化表结构,初始化数据的sql
解法
SHOW STATUS是什么
SHOW STATUS 能获取mysql服务的一些状态,这些状态是mysql服务的性能参数!
语法:
SHOW [SESSION | GLOBAL] STATUS
SESSION表示获取当前会话级别的性能参数,GLOBAL表示获取全局级别的性能参数,并且SESSION和GLOBAL可以省略,如果省略不写,默认为SESSION。
参数很多,所以在查找指定参数时,可用以下语法:
SHOW [SESSION | GLOBAL] STATUS LIKE 'status_name';
其中status_name 为状态的参数名称。
实战经验:常用的mysql状态查询
1、QPS(每秒处理的请求数量)
QPS是mysql每秒所执行的sql数量,但不仅限于select 、instert、update和delete语句。
QPS = Questions(or Queries) / seconds
show global status like 'Question%';
show global status like 'uptime_since_flush_status';
计算思路:
先从show global status like ‘Question%’; 得到Question1的数据,经过一段时间后,再计算show global status like ‘Question%’; ,得到Question2的数据。
QPS = (Question2-Question1)/(uptime_since_flush_status2-uptime_since_flush_status1)
Questions和 Queries的区别
因为 Queries 计数统计的更多,所以理论上 Queries 计数总是大于等于 Questions 计数。
Queries会比Questions 多统计存储过程语句和预准备语句。
2、TPS(每秒处理的事务数量)
TPS指的是每秒处理的事务数量,不包含select语句。
TPS = (Com_commit + Com_rollback) / seconds
show global status like 'Com_commit';
show global status like 'Com_rollback';
字段说明:
Com_commit:事务提交数
Com_rollback:事务回滚数
对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。
计算思路:
先得到** (Com_commit + Com_rollback) ** 的值commit_rollback1,然后经过一段时间后,再得到** (Com_commit + Com_rollback) ** 的值commit_rollback2。
TPS = (commit_rollback2-commit_rollback1)/(uptime_since_flush_status2-uptime_since_flush_status1);
3、key Buffer 命中率
key buffer 命中率代表了Myisam类型表的索引cache命中率,命中率的大小直接影响myisam类型表的读写性能。
命中率过低,说明myisam类型表的读写存在问题。
key buffer 命中率实际上包括读命中率和写命中率两种,计算公式如下:
key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%
show global status like 'key%';
4、InnoDB Buffer命中率
innodb buffer 所指的是innodb_buffer_pool,也就是用来缓存innodb类型表和索引的内在空间。
命中率过低,说明innodb类型表的读写存在问题。
计算公式:
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%
show global status like 'innodb_buffer_pool_read%';
5、query cache命中率
query cache 是mysql的查询cache,在my.cnf配置文件若打开,则可以对查询过的语句结果进行cache。
对于一些用户数不高或一次性统计平台建议关闭查询缓存。
若开启query cache,则对query cache 命中率进行监控也是需要的,它可以告诉我们是数据库是否在正确使用query cache。
计算公式:
query_cache_hits =(Qcache_hits/(Qcache_hits+Qcache_inserts))* 100%;
show global status like 'Qcache%';
在mysql5中,引入了query-cache的功能,query-cache默认是关闭的。
mysql建议我们用第三方的缓存技术,而不是用mysql本身的 query-cache去缓存数据,在mysql8也移除了query-cache
6 、table_cache(table_open_cache) 命中率
table_cache是一个非常重要的MySQL性能参数,table_cache主要用于设置table高速缓存的数量。在5.1.3之后的版本中叫做table_open_cache。
由于每个客户端连接都会至少访问一个表,因此此参数的值与max_connections有关。
当mysql访问某个表时,若表缓存空间还有空间,则将该表就被打开并将数据放入其中,下次访问此表时可以更快的访问表的内容。
通过查峰值时间的状态值open_tables 和 opened_tables可以决定是否需要增加table_cache值。
需要注意的是table_cache设置很太高,可能会造成文件描述符不足,从而造成性能不稳定或是连接失败。
建议:状态量open_tables与opened_tables之间的比率要大于80%
open_tables与opened_tables之间的比率过低,则代表table cache设置过小。
show global status like 'open%_tables';
查看table_open_cache的值:
show global variables like 'table_open_cache';
修改table_open_cache 的值,方式如下:
- 方式一:可以在my.ini或my.cnf里修改参数table_open_cache 的值。要重启mysql服务。
- 方式二:在SET GLOBAL table_open_cache= 2000;这种方式不需要重启mysql服务。MySQL重启后会失效。
6、thread cache命中率
在mysql中,为了尽可能提高客户端连接的过程,实现 了一个thread cache池,将空闲的连接线程存放在其中,而不是请求完成后销毁,当有新的连接请求的时候,mysql首先检查thread cache是否存储空闲的连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的线程。
thread cache命中率能直接反应出系统参数thread_cache_size设置是否合理。一个合理的read_cache_size参数能够节约大量创建新连接时所需要消耗的资源。正常来说,thread cache命中率在90% 以上才算合理。
计算公式:
thread_cache_hits = (1- threads_created/connections) * 100 %;
show global status like 'Thread%';
show global status like 'Connections';
参数说明:
- threads_created:表示创建过的线程数,很明显,threads_created过大,表明mysql服务器一直在创建线程,这也是比较耗资源,说明服务器不健康
- Connections:连接MySQL服务器的次数。
优化
如果thread cache命中率低于90%
查看thread_cache_size 的大小:
show global variables like 'thread_cache_size';
适当增加配置文件中thread_cache_size值,在my.cnf文件中直接加上thread_cache_size=64。
重启Mysql服务,配置生效。
或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。
set global thread_cache_size=30;
7、tmp table相关状况分析
tmp table 主要用于监控mysql使用临时表的量是否过多,是否有临时表过大而不得不从内存中换出到磁盘文件中
show global status like 'created_tmp%';
参数说明:
Created_tmp_disk_tables:为临时表过大无法在内存中完成,而不得不使用磁盘的次数。
若create_tmp_tables比较多,则可能排序句子过多,或者可能是连接方式不是很优化。
而如果是create_tmp_dis_table/create_tmp_tables比率过高,如超过10%,则需要考虑tmp_table_size参数是否需要调整大些。
建议tmp_table_size与max_heap_table_size需要设置成一样大。
在my.cnf文件中直接加上/调整tmp_table_size 的值。重启Mysql服务,配置生效。
或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。
set global tmp_table_size=自定义;
查看生效的配置:
show global variables like 'tmp_table_size';
show global variables like 'max_heap_table_size';
8、binlog cache
若打开binlog日志功能,则需要考虑binlog cache问题。binlog不是一有数据就写到binlog中,而是先写入到binlog cache中,再写入到binlog中。
Binlog_cache_disk_use为binlog使用硬盘使用量, Binlog_cache_use 为binlog已使用的量。若 Binlog_cache_disk_use大于0,则说明binlog_cache不够用,需要调大 binlog_cache_size大小。
show status like 'binlog_cache%';
在my.cnf文件中直接加上/调整binlog_cache_size 的值。重启Mysql服务,配置生效。
或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。
set global binlog_cache_size=自定义;
查看生效的配置:
show global variables like 'binlog_cache_size';
9、innodb_log_waits
show status like 'innodb_log_waits';
Innodb_log_waits值不等于0的话,表明 innodb log buffer 因为空间不足而等待。需要增加innodb_log_buffer_size的值,适当的增加不会造成内存不足的问题。
在my.cnf文件中直接加上/调整innodb_log_buffer_size 的值。重启Mysql服务,配置生效。
或者执行下面这个命令,这种方式不需要重启mysql服务。MySQL重启后会失效。
set global innodb_log_buffer_size=自定义;
查看生效的配置:
show global variables like 'innodb_log_buffer_size';
10、锁状态
mysql的锁有表锁和行锁,myisam最小锁为表锁,innodb最小锁为行锁,可以通过以下命令获取锁定次数、锁定造成其他线程等待次数,以及锁定等待时间信息。
show status like '%lock%';
Table_locks_waited/Table_locks_immediate 的比值比较大的话,说明表锁造成的阻塞比较严重。可能需要调整Query语句,或者更改存储引擎,亦或者需要调整业务逻辑。
而Innodb_row_lock_waits较大,则说明Innodb的行锁也比较严重,且影响了其他线程的正常处理。
造成Innodb行锁严重的原因可能是Query语句所利用的索引不够合理(Innodb行锁是基于索引来锁定的),造成间隙锁过大。
三、总结
本文介绍了什么是SHOW STATUS,以及如何使用SHOW STATUS。分享了10个常用的mysql状态查询:
- QPS(每秒Query量)
- TPS(每秒事务数)
- key Buffer 命中率
- InnoDB Buffer命中率
- query cache命中率
- table_cache(table_open_cache) 命中率
- tmp table相关状况分析
- binlog cache
- innodb_log_waits
- 锁状态
所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。
四、参考
MySQL进阶技能树>查询优化> SHOW STATUS如何计算 MySQL 的 QPS/TPSMySQL调试–show status