暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

面试官:你知道有哪些监控sql执行情况的手段?

Elastic之家 2022-06-22
477

0. 引言

要想进阶针对mysql学习乃至掌握mysql调优的基本技能,监控mysql的执行情况必不可少。就像我们的代码,如果不能debug,想要进行调优排错,难度将会大大增加。

所以今天我们就来讲解如何监控mysql的sql执行情况

1. show profile指令

1.1 什么是show profile?

show profile是mysql提供的用来分析当前会话中sql语句执行的资源消耗情况,利用它我们可以用来分析sql的性能,作为调优的测量工具

show profile默认是关闭的,可以通过set profiling=1;
指令来开启,但是需要注意的是每次开启只是生效在当前会话中,想要永久生效的话需要修改mysql配置文件

1.2 如何使用show profile?

1、首先开启show profile,mysql中执行指令

    set profiling=1;
    复制

    2、我们运行一段测试的sql

      select * from user_test.user where id in (select id from user_test.food);
      复制

      3、执行show profiles;
       查询最近执行的sql的情况



      如上图所示,我们可以看到,我们刚刚执行的这条sql的执行时间为0.00054s,queryId为243

      4、那么我们还可以通过这个queryId进阶监控这个sql的其他资源消耗情况,比如查询其CPU的消耗情况

        show profile CPU for query 243;
        复制



        其中status
        表示的是sql指定的各个阶段的状态,duration
        表示的是各个状态的耗时,cpu_user
        表示当前用户占用的cpu,cpu_system
        表示系统占用的cpu

        结果分析:通过上述结果可知,我们执行的sql的大部分时间消耗在启动上,其次消耗在打开table,真正花在执行上的时间只有0.000061s

        除了上述演示的监控cpu的资源消耗,show profile还提供了如下的监控类型 |监控类型|语句| |-|-| |显示所有性能信息|all| |显示块IO开销|block io| |显示上下文开销|context switches| |显示用户cpu时间、系统cpu时间|cpu| |显示发送和接收的消息数量|ipc| |显示页错误数量|page faults| |显示源码中的函数名称与位置|source| |显示swap的次数|swaps|

        指令格式:

          show profile [type] [for query query_id]
          复制

          另外一个常用的指令是show profile;
          ,这个是用于查询最近一个profiling信息

          注意
          : show profile在mysql5.7中就已经显示过时了,虽然仍然可用,但mysql推荐更还用的performance_schema
          语句来监控sql执行情况

          2. performance_schema

          2.1 什么是performance_schema?

          performance_schema实际上是一个数据库,我们可以通过数据库查询指令show databases;
          或者像navicat这样的数据库管理软件查看到该数据库。



          performance_schema是用于监控mysql在一个较低级别的运行过程中的资源消耗、资源等待的情况。它提供了一系列的表格,这些表格中存储了关于数据库运行期间的性能相关的数据,如磁盘、IO、锁、CPU等相关信息。

          performance_schema比show profile更加详尽,5.6版本后默认是开启的,可以在mysql配置文件中看到配置项

            [mysqld]
            performance_schema=ON
            复制

            performance_schema采用的是performance_schema存储引擎,而非innodb或者mysiam、memory

            2.2 performance_schema表分类

            分类表名
            语句事件记录表show tables like '%statement%';
            当前语句事件表events_statements_current
            历史语句事件表events_statements_history
            长语句历史事件表events_statements_history_long
            摘要表summary
            等待事件记录表,与语句事件类型的相关记录表类似show tables like '%wait%';
            阶段事件记录表,记录语句执行的阶段事件的表show tables like '%stage%';
            事务事件记录表,记录事务相关的事件的表show tables like '%transaction%';
            监控文件系统层调用的表show tables like '%file%';
            监控内存使用的表show tables like '%memory%';
            动态对performance_schema进行配置的配置表show tables like '%setup%';

            2.2 如何使用performance_schema?

            instruments和consumers

            在开始讲述performance_schema的使用之前,我们要先了解两个概念:

            instruments:生产者,用于采集mysql中各种各样的操作产生的事件信息,对应setup_instruments配置表中的配置项,也可以称为监控采集配置项consumers:消费者,对应的消费者表用于存储来自instruments采集的数据,对应setup_consumers配置表中的配置项,可以称为消费存储配置项

            虽然performance_schema默认是开启的,但是数据库刚启动时并非所有的采集项都打开了,也就是说,默认不会采集所有的事件。

            有可能你需要检测的事件并没有打开,那么就需要我们手动将对应项打开。

            比如打开等待时间的采集器开关,需要修改setup_instruments表中对应的采集器配置项

              update setup_instruments set ENABLED='YES',TIMED='YES' where name like 'wait%'; 
              复制

              打开等待事件的保存表配置开关,需要修改setup_consumers配置表中对应的配置项

                update setup_consumers set ENABLE='YES' where name like '%wait%';
                复制

                常用查询

                4. 其他监控指令

                4.1 show processlist 监控连接线程数

                show processlist指令可以查询到mysql当前的连接线程,以此来监控mysql是否有大量线程数连接,从而进行排查

                  show processlist
                  复制

                  执行结果


                  4.2 last_query_cost 监控数据页

                  mysql中是以数据页为单位来存储数据的,last_query_cost指令用于查询最近一次查询需要查找多少个数据页。查找的数据页越多,IO越高,性能越差

                    show status like 'last_query_cost';
                    复制

                    执行结果


                    文中代码可通过点击阅读原文获取

                    Elastic

                    Elastic


                    ~


                    文章转载自Elastic之家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                    评论