2、mysql性能监控performance_schema
基础层次
聊到mysql时候,首先要知道mysql的一个层次,
- 客户端
- server
- 存储引擎
首先客户端要发送请求和服务端进行连接,所有先有个连接器,会有一些认证,比如用户名和密码的匹配,
第二步,客户端和服务端连接后,要发送一些请求,所以有个分析器。客户端发来的sql语句本质上就是个字符串,所以要进行解析切分,进行语法分析,通过关键字比如from、where。。。
比如有个sql A表join B表,那到底先读A表还是B表的数据呢,所以要有个优化器,说明mysql自带的已经有优化了,但这些优化还远不够。优化分为RBO和CBO,
- RBO:基于规则的优化,比较基础
- CBO:基于成本基于代价的优化,目前企业中更多的是这种方式的优化
优化好后,接下来是执行器,执行器主要是和存储引擎进行一个挂钩,就是要从磁盘里面获取数据了。
但是取数据不是乱取的,所以我们写sql时候是绝对不许写select *
的,归根到底还是IO问题,IO从硬件层面无法避免的,所以要减少IO的量或者减少IO的次数,但不管怎么样,我们是想要尽量少的从磁盘里读取数据。
在mysql8版本之前,还有的东西叫查询缓存,不过在mysql8之后就被废弃了,因为在我们在使用关系型数据库时候,数据的变更是非常频繁的,如果一些常量枚举的数据可以放在缓存里,但如果是经常变更的数据,就不要放进去了,所以就把查询缓存剔除掉了。
总结:
性能监控
如图:
进入mysql命令行,随便写个sql查询一个表,这个sql执行的很快,可以看到(0.00 sec),难道是执行这条sql没有一点的耗时吗?肯定不可能。
我们可以设置set profiling=1;
设置成功后,可以使用命令:
show profiles;
可以看到执行的sql具体耗时
除此之外,还可以执行
show profile;
可以看到具体的在哪些阶段耗时多少
如图可以看到主要是在starting准备数据时候和Sending data 发送数据时候耗时较多。
上面只是执行了一个sql,如果是执行了多个sql,再去执行show profiles;
就会显示所有执行过的sql
既然显示了所有执行过的sql,如果还是只执行show profile;
,就显示只有最后一条执行过的sql的具体执行耗时
如果想看哪一个sql具体耗时,通过第一列的Query_ID来查看,比如查看第2个sql执行耗时
show profile for query 2;
执行后显示:
如果光看以上的还不够,还可以加一些属性来查看
官网显示:
比如查看CPU:
show profile cpu;
可以通过列字段看到用户使用cpu和系统使用cpu的时间参数值
如果想看更具体的,可以执行show profile all;
自己试试。
Performance Schema
mysql官网说:在后期的mysql高版本中会废弃掉通过设置set profiling=1;
然后查看sql的执行效率,而是通过Performance Schema
执行mysql命令:
show databases;
可以看到有个preformance_schema数据库
然后使用这个数据库use preformance_schema;
查看里面的表show tables;
,可以查看到里面的87个表。
看到这么多表不要慌,根据官网提供的说明来使用它:
如果之前没有做过设置的话,默认是开启的,如果要手动关闭,必须要打开mysql的一个配置文件,在目录vi /etc/my.cnf
文件中进行修改
通过show create table setup_consumers;
来查看创建表的时候的表结构
performance_schema库下的表可以按照监视不同的纬度就行分组分类。
Performance Schema 默认是开启的,但是里面具体的值并不是默认开启的,查看:
select * from setup_instruments;
可以看到很多属性是否开启,属性非常多,其中有两列
- ENABLED 表示属性监控是否开启
- TIMED 表示计时器是否开启
通过查询events_waits_current表来得知当前server正在做什么
select * from events_waits_current\G
该表中每个线程只包含一行数据,用于显示每个线程的最新监视事件
具体的Performance Schema详细介绍和操作参考:https://www.cnblogs.com/abiu/p/16894713.html