您现在的位置:新闻首页>资本 > 初识MySQL调优之性能监控
初识MySQL调优之性能监控
mysql教程栏目介绍认识性能监控。
MySQL优化主要从其逻辑架构的核心层-分析、优化、执行阶段着手。
实验过程中,我是用的MySQL版本是5.7,关于MySQL的快速安装,可参考 如何在CentOS7下快速安装MySQL5.7。
MySQL调优,我们先从性能监控开始,找点感觉。
使用show profile
show profile是MySQL的查询剖析工具。
mysql> show variables like '%profil%'; +------------------------+-------+ Variable_name Value +------------------------+-------+ have_profiling YES profiling OFF profiling_history_size 15 +------------------------+-------+3 rows in set (0.00 sec)复制代码
可以看到此工具默认是OFF(禁用)的,可以通过服务器变量在当前会话级别动态的修改
mysql> set profiling=1; Query OK, 0 rows affected, 1 warning (0.00 sec)复制代码
当设置完成之后,在服务器上执行的所有语句,都会测量其耗费的时间和其他一些查询执行状态变更相关的数据。
我们来创建一个表来演示一下:
mysql> create database mytest; Query OK, 1 row affected (0.01 sec) mysql> use mytest; Database changed mysql> create table stu(id int(8), name varchar(20)); Query OK, 0 rows affected (0.07 sec) mysql> insert into stu(id, name) values(1, 'Jack Ma'); Query OK, 1 row affected (0.01 sec) mysql> insert into stu(id, name) values(1, 'Pony'); Query OK, 1 row affected (0.03 sec)复制代码
查询一下stu表:
mysql> select * from stu; +------+---------+ id name +------+---------+ 1 Jack Ma 2 Pony +------+---------+2 rows in set (0.00 sec)复制代码
这个2 rows in set (0.00 sec)就是用命令行执行一个sql后给出的提示,而且还有执行时间0.00秒。
在mysql的命令行模式下只能显示两位小数的时间,可以使用如下命令查看具体的执行时间
mysql> show profile; +----------------------+----------+ Status Duration +----------------------+----------+ starting 0.000061 checking permissions 0.000009 Opening tables 0.000019 init 0.000020 System lock 0.000009 optimizing 0.000005 statistics 0.000014 preparing 0.000011 executing 0.000003 Sending data 0.000121 end 0.000012 query end 0.000011 closing tables 0.000011 freeing items 0.000021 cleaning up 0.000021 +----------------------+----------+复制代码
这样我们可以清晰地看到,Starting、System lock系统锁、Sending data等等一系列操作分别用了多少时间。
通过上面的演示,我们可以看到,show profile一执行完就给我们返回每项的执行时间,并没有显示是针对哪条sql的,其实它就是列出了最近一条你执行的sql语句的执行时间。
那一定有可以看之前执行过的多条sql语句的情况吧?是的,show profiles
show profilesmysql> show profiles; +----------+------------+------------------------------------------------+ Query_ID Duration Query +----------+------------+------------------------------------------------+ 1 0.02907350 create table stu(id int(8), name varchar(20)) 2 0.00337800 create database mytest 3 0.02786850 SELECT DATABASE() 4 0.00065300 show databases 5 0.00086700 show tables 6 0.06554900 create table stu(id int(8), name varchar(20)) 7 0.00079850 insert into stu(1, 'Jack') 8 0.06901975 show create table stu 9 0.00008800 insert into stu(1, 'Jack') 10 0.00616000 insert into stu(id, name) values(1, 'Jack Ma') 11 0.03119675 insert into stu(id, name) values(1, 'Pony') 12 0.03124900 update stu set id=2 where name='Pony' 13 0.00036975 select * from stu 14 0.00034925 select * from stu +----------+------------+------------------------------------------------+14 rows in set, 1 warning (0.00 sec)复制代码
列出了执行过的sql语句执行时间,我们可以挑一个查询来单独看,比如我想看insert into stu(id, name) values(1, 'Pony')这条语句的情况,可以用下面的操作:
mysql> show profile for query 11; +----------------------+----------+ Status Duration +----------------------+----------+ starting 0.000072 checking permissions 0.000009 Opening tables 0.000021 init 0.000018 System lock 0.000008 update 0.000094 end 0.000005 query end 0.030815 closing tables 0.000036 freeing items 0.000081 cleaning up 0.000039 +----------------------+----------+11 rows in set, 1 warning (0.00 sec)复制代码
也就是说可以根据Query_ID结合show profile来看。
MySQL官网上,关于show profile语句:
SHOW PROFILE [type [, type] ... ] [FOR QUERY n] [LIMIT row_count [OFFSET offset]] type: { ALL BLOCK IO CONTEXT SWITCHES CPU IPC MEMORY PAGE FAULTS SOURCE SWAPS }复制代码
show profile、for query n前面已经说过了,下面我列一下每个type是什么意思。
all 显示所有性能信息
block io 显示块io操作的次数
context switches 显示上下文切换次数,被动和主动
cpu 显示用户cpu时间、系统cpu时间
IPC 显示发送和接受的消息数量
Memory 暂未实现
page faults 显示页错误数量
source 显示源码中的函数名称与位置
swaps 显示swap的次数
实操一下看看
mysql> show profiles; +----------+------------+-------------------------------+ Query_ID Duration Query +----------+------------+-------------------------------+ 1 0.00009625 show variable like '%profi%' 2 0.00373950 show variables like '%profi%' 3 0.00025825 select * from stu +----------+------------+-------------------------------+3 rows in set, 1 warning (0.00 sec)复制代码
我们针对Query_ID为3的进行查看
all
查询最后的\G的目的是格式化显示一下查询结果。
这里我们可以看到,show profile all可以看到所有的性能信息。
block iomysql> show profile block io for query 3; +----------------------+----------+--------------+---------------+ Status Duration Block_ops_in Block_ops_out +----------------------+----------+--------------+---------------+ starting 0.000070 0 0 checking permissions 0.000011 0 0 Opening tables 0.000021 0 0 init 0.000019 0 0 System lock 0.000009 0 0 optimizing 0.000005 0 0 statistics 0.000014 0 0 preparing 0.000011 0 0 executing 0.000004 0 0 Sending data 0.000050 0 0 end 0.000005 0 0 query end 0.000008 0 0 closing tables 0.000008 0 0 freeing items 0.000013 0 0 cleaning up 0.000014 0 0 +----------------------+----------+--------------+---------------+15 rows in set, 1 warning (0.00 sec)复制代码
最后两列就表示块io操作的次数。
下面只把各个type的语法列出来,演示效果不在此赘述了。
show profile context switches for query 3show profile cpu for query 3show profile ipc for query 3show profile page faults for query 3show profile source for query 3show profile swaps for query 3
show profile用起来感觉很爽啊,他能帮我们看到sql语句各部分的执行时间,这对我们定位线上sql执行慢的问题很有帮助啊,but,官网上有这么一段话:
Note
The SHOW PROFILE and SHOW PROFILES statements are deprecated and will be removed in a future MySQL release. Use the Performance Schema instead;
注意
不使用SHOW PROFILE和SHOW PROFILES语句,并将在以后的MySQL版本中将其删除。
改用Performance Schema;
好吧,你说删除就删除。但是在MySQL删除show profile之前,我们还是可以用的,毕竟很香嘛。
既然后续版本会用Performance Schema,那么我们还看下它是何方神圣吧!
Performance Schema
MySQL的performance schema用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况。使用performance schema可以更加容易的监控MySQL。
在MySQL的5.7版本中,性能模式是默认开启的,如果想要显式的关闭的话需要修改配置文件,不能直接进行修改,会报错Variable 'performance_schema' is a read only variable。
mysql> show variables like 'performance_schema'; +--------------------+-------+ Variable_name Value +--------------------+-------+ performance_schema ON +--------------------+-------+mysql> set performance_schema=0; ERROR 1238 (HY000): Variable 'performance_schema' is a read only variable复制代码
在配置文件中修改performance_schema的属性值,on表示开启,off表示关闭
[mysqld] performance_schema=ON复制代码
看下performance_schema数据库有哪些功能表:
mysql> use performance_schema; mysql> show tables;复制代码
一共有87张表,分别存储着相关的信息。
可以通过show create table tablename来查看创建表的时候的表结构:
mysql> show create table threads\G *************************** 1. row *************************** Table: threadsCreate Table: CREATE TABLE `threads` ( `THREAD_ID` bigint(20) unsigned NOT NULL, `NAME` varchar(128) NOT NULL, `TYPE` varchar(10) NOT NULL, `PROCESSLIST_ID` bigint(20) unsigned DEFAULT NULL, `PROCESSLIST_USER` varchar(32) DEFAULT NULL, `PROCESSLIST_HOST` varchar(60) DEFAULT NULL, `PROCESSLIST_DB` varchar(64) DEFAULT NULL, `PROCESSLIST_COMMAND` varchar(16) DEFAULT NULL, `PROCESSLIST_TIME` bigint(20) DEFAULT NULL, `PROCESSLIST_STATE` varchar(64) DEFAULT NULL, `PROCESSLIST_INFO` longtext, `PARENT_THREAD_ID` bigint(20) unsigned DEFAULT NULL, `ROLE` varchar(64) DEFAULT NULL, `INSTRUMENTED` enum('YES','NO') NOT NULL, `HISTORY` enum('YES','NO') NOT NULL, `CONNECTION_TYPE` varchar(16) DEFAULT NULL, `THREAD_OS_ID` bigint(20) unsigned DEFAULT NULL) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf81 row in set (0.00 sec)复制代码
我一看到threads这个表名,还有THREAD_ID、PROCESSLIST_ID等等字段,就感觉这些比较重要啊有木有!
再来看一下setup_consumers这个表:
mysql> show create table setup_consumers; +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ Table Create Table +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ setup_consumers CREATE TABLE `setup_consumers` ( `NAME` varchar(64) NOT NULL, `ENABLED` enum('YES','NO') NOT NULL) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8 +-----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)复制代码
这个consumer总感觉似曾相识啊!
其实,想要搞明白后续的内容,我们需要理解两个基本概念:
instruments 生产者,用于采集mysql中各种各样的操作产生的事件信息,对应配置表中的配置项我们可以称为监控采集配置项。consumers 消费者,对应的消费者表用于存储来自instruments采集的数据,对应配置表中的配置项我们可以称为消费存储配置项。performance_schema表的分类
performance_schema库下的表可以按照监视不同的纬度就行分组。
--语句事件记录表,这些表记录了语句事件信息,当前语句事件表events_statements_current、历史语句事件表events_statements_history和长语句历史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分)show tables like '%statement%';--等待事件记录表,与语句事件类型的相关记录表类似: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%';复制代码
来,那一个事务相关的来瞅一眼:
mysql> show tables like '%transaction%'; +------------------------------------------------------+ Tables_in_performance_schema (%transaction%) +------------------------------------------------------+ events_transactions_current events_transactions_history events_transactions_history_long events_transactions_summary_by_account_by_event_name events_transactions_summary_by_host_by_event_name events_transactions_summary_by_thread_by_event_name events_transactions_summary_by_user_by_event_name events_transactions_summary_global_by_event_name +------------------------------------------------------+8 rows in set (0.00 sec)复制代码performance_schema的简单配置与使用
数据库刚刚初始化并启动时,并非所有instruments(事件采集项,在采集项的配置表中每一项都有一个开关字段,或为YES,或为NO)和consumers(与采集项类似,也有一个对应的事件类型保存表配置项,为YES就表示对应的表保存性能数据,为NO就表示对应的表不保存性能数据)都启用了,所以默认不会收集所有的事件。
可能你需要检测的事件并没有打开,需要进行设置,可以使用如下两个语句打开对应的instruments和consumers(行计数可能会因MySQL版本而异)。
打开等待事件的采集器配置项开关,需要修改setup_instruments配置表中对应的采集器配置项
mysql> UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES' where name like 'wait%'; Query OK, 267 rows affected (0.03 sec) Rows matched: 321 Changed: 267 Warnings: 0复制代码
打开等待事件的保存表配置开关,修改setup_consumers配置表中对应的配置项
mysql> UPDATE setup_consumers SET ENABLED = 'YES' where name like '%wait%'; Query OK, 3 rows affected (0.04 sec) Rows matched: 3 Changed: 3 Warnings: 0复制代码
当配置完成之后可以查看当前server正在做什么。
可以通过查询events_waits_current表来得知,该表中每个线程只包含一行数据,用于显示每个线程的最新监视事件:
释义:
该信息表示线的线程正在等待buf_dblwr_mutex锁,等待时间为69917。 属性说明: id:事件来自哪个线程,事件编号是多少 event_name:表示检测到的具体的内容 source:表示这个检测代码在哪个源文件中以及行号 timer_start:表示该事件的开始时间 timer_end:表示该事件的结束时间 timer_wait:表示该事件总的花费时间 注意:_current表中每个线程只保留一条记录,一旦线程完成工作,该表中不会再记录该线程的事件信息。复制代码_history表中记录每个线程应该执行完成的事件信息,但每个线条,再多就会被覆盖,(下面的演示可以看到每个线条记录)。_history_long表中记录所有线程的事件信息,但总记录数量是10000,超过就会被覆盖掉mysql> mysql> select thread_id,event_id,event_name,timer_wait from events_waits_history order by thread_id limit 21; +-----------+----------+------------------------------------------+------------+ thread_id event_id event_name timer_wait +-----------+----------+------------------------------------------+------------+ 3 4042 wait/synch/mutex/innodb/buf_pool_mutex 47785 3 4043 wait/synch/mutex/innodb/flush_list_mutex 43761 3 4044 wait/synch/mutex/innodb/buf_pool_mutex 58851 3 4045 wait/synch/mutex/innodb/buf_dblwr_mutex 73438 3 4046 wait/synch/mutex/innodb/buf_pool_mutex 222829 3 4047 wait/synch/mutex/innodb/buf_pool_mutex 42755 3 4048 wait/synch/mutex/innodb/flush_list_mutex 44767 3 4049 wait/synch/mutex/innodb/buf_pool_mutex 59857 3 4050 wait/synch/mutex/innodb/buf_dblwr_mutex 72432 3 4041 wait/synch/mutex/innodb/buf_pool_mutex 243452 17 2442 wait/synch/mutex/innodb/sync_array_mutex 74947 17 2440 wait/synch/mutex/innodb/sync_array_mutex 82492 17 2439 wait/synch/mutex/innodb/sync_array_mutex 458233 17 2438 wait/synch/mutex/innodb/log_sys_mutex 239428 17 2437 wait/synch/mutex/innodb/sync_array_mutex 85510 17 2446 wait/synch/mutex/innodb/sync_array_mutex 84504 17 2445 wait/synch/mutex/innodb/sync_array_mutex 77462 17 2444 wait/synch/mutex/innodb/log_sys_mutex 238422 17 2443 wait/synch/mutex/innodb/sync_array_mutex 83498 17 2441 wait/synch/mutex/innodb/log_sys_mutex 229368 19 7281 wait/synch/mutex/innodb/flush_list_mutex 43761 +-----------+----------+------------------------------------------+------------+21 rows in set (0.00 sec)复制代码summary表提供所有事件的汇总信息,该组中的表以不同的方式汇总事件数据(如:按用户,按主机,按线程等等)。
例如:要查看哪些instruments占用最多的时间,可以通过对events_waits_summary_global_by_event_name表的COUNT_STAR或SUM_TIMER_WAIT列进行查询(这两列是对事件的记录数执行COUNT(*)、事件记录的TIMER_WAIT列执行SUM(TIMER_WAIT)统计而来)
mysql> SELECT EVENT_NAME,COUNT_STAR FROM events_waits_summary_global_by_event_name ORDER BY COUNT_STAR DESC LIMIT 10; +-----------------------------------------------+------------+ EVENT_NAME COUNT_STAR +-----------------------------------------------+------------+ wait/synch/mutex/innodb/buf_pool_mutex 3357 wait/synch/mutex/innodb/log_sys_mutex 3357 wait/synch/mutex/innodb/sync_array_mutex 2241 wait/synch/mutex/innodb/flush_list_mutex 2238 wait/io/file/sql/FRM 1590 wait/synch/mutex/innodb/log_flush_order_mutex 1119 wait/synch/mutex/innodb/log_sys_write_mutex 1119 wait/synch/mutex/innodb/fil_system_mutex 1119 wait/synch/mutex/innodb/dict_sys_mutex 1119 wait/synch/mutex/innodb/buf_dblwr_mutex 1119 +-----------------------------------------------+------------+10 rows in set (0.10 sec)复制代码instance表记录了哪些类型的对象会被检测。这些对象在被server使用时,在该表中将会产生一条事件记录。
例如,file_instances表列出了文件I/O操作及其关联文件名
mysql> select * from file_instances limit 10; +----------------------------------------+--------------------------------------+------------+ FILE_NAME EVENT_NAME OPEN_COUNT +----------------------------------------+--------------------------------------+------------+ /usr/share/mysql/english/errmsg.sys wait/io/file/sql/ERRMSG 0 /usr/share/mysql/charsets/Index.xml wait/io/file/mysys/charset 0 /var/lib/mysql/ibdata1 wait/io/file/innodb/innodb_data_file 3 /var/lib/mysql/ib_logfile0 wait/io/file/innodb/innodb_log_file 2 /var/lib/mysql/ib_logfile1 wait/io/file/innodb/innodb_log_file 2 /var/lib/mysql/mysql/engine_cost.ibd wait/io/file/innodb/innodb_data_file 3 /var/lib/mysql/mysql/gtid_executed.ibd wait/io/file/innodb/innodb_data_file 3 /var/lib/mysql/mysql/help_category.ibd wait/io/file/innodb/innodb_data_file 3 /var/lib/mysql/mysql/help_keyword.ibd wait/io/file/innodb/innodb_data_file 3 /var/lib/mysql/mysql/help_relation.ibd wait/io/file/innodb/innodb_data_file 3 +----------------------------------------+--------------------------------------+------------+10 rows in set (0.00 sec)复制代码常用配置项的参数说明启动选项performance_schema_consumer_events_statements_current=TRUE#是否在mysql server启动时就开启events_statements_current表的记录功能(该表记录当前的语句事件信息),启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新setup_consumers配置表中的events_statements_current配置项,默认值为TRUEperformance_schema_consumer_events_statements_history=TRUE#与performance_schema_consumer_events_statements_current选项类似,但该选项是用于配置是否记录语句事件短历史信息,默认为TRUEperformance_schema_consumer_events_stages_history_long=FALSE#与performance_schema_consumer_events_statements_current选项类似,但该选项是用于配置是否记录语句事件长历史信息,默认为FALSE除了statement(语句)事件之外,还支持:wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个启动项分别进行配置,但这些等待事件默认未启用,如果需要在MySQL Server启动时一同启动,则通常需要写进配置文件中 performance_schema_consumer_global_instrumentation=TRUE 是否在MySQL Server启动时就开启全局表(如:mutex_instances、rwlock_instances、cond_instances、file_instances、users、hostsaccounts、socket_summary_by_event_name、file_summary_by_instance等大部分的全局对象计数统计和事件汇总统计信息表 )的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新全局配置项 默认值为TRUEperformance_schema_consumer_statements_digest=TRUE是否在MySQL Server启动时就开启events_statements_summary_by_digest 表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新digest配置项 默认值为TRUEperformance_schema_consumer_thread_instrumentation=TRUE是否在MySQL Server启动时就开启 events_xxx_summary_by_yyy_by_event_name表的记录功能,启动之后也可以在setup_consumers表中使用UPDATE语句进行动态更新线程配置项 默认值为TRUEperformance_schema_instrument[=name] 是否在MySQL Server启动时就启用某些采集器,由于instruments配置项多达数千个,所以该配置项支持key-value模式,还支持%号进行通配等,如下:# [=name]可以指定为具体的Instruments名称(但是这样如果有多个需要指定的时候,就需要使用该选项多次),也可以使用通配符,可以指定instruments相同的前缀+通配符,也可以使用%代表所有的instruments## 指定开启单个instruments--performance-schema-instrument= 'instrument_name=value'## 使用通配符指定开启多个instruments--performance-schema-instrument= 'wait/synch/cond/%=COUNTED'## 开关所有的instruments--performance-schema-instrument= '%=ON'--performance-schema-instrument= '%=OFF'注意,这些启动选项要生效的前提是,需要设置performance_schema=ON。另外,这些启动选项虽然无法使用show variables语句查看,但我们可以通过setup_instruments和setup_consumers表查询这些选项指定的值。复制代码系统变量show variables like '%performance_schema%'; --重要的属性解释 performance_schema=ON /* 控制performance_schema功能的开关,要使用MySQL的performance_schema,需要在mysqld启动时启用,以启用事件收集功能 该参数在5.7.x之前支持performance_schema的版本中默认关闭,5.7.x版本开始默认开启 注意:如果mysqld在初始化performance_schema时发现无法分配任何相关的内部缓冲区,则performance_schema将自动禁用,并将performance_schema设置为OFF */ performance_schema_digests_size=10000 /* 控制events_statements_summary_by_digest表中的最大行数。如果产生的语句摘要信息超过此最大值,便无法继续存入该表,此时performance_schema会增加状态变量 */ performance_schema_events_statements_history_long_size=10000 /* 控制events_statements_history_long表中的最大行数,该参数控制所有会话在events_statements_history_long表中能够存放的总事件记录数,超过这个限制之后,最早的记录将被覆盖 全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10000,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10000 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10000 */ performance_schema_events_statements_history_size=10 /* 控制events_statements_history表中单个线程(会话)的最大行数,该参数控制单个会话在events_statements_history表中能够存放的事件记录数,超过这个限制之后,单个会话最早的记录将被覆盖 全局变量,只读变量,整型值,5.6.3版本引入 * 5.6.x版本中,5.6.5及其之前的版本默认为10,5.6.6及其之后的版本默认值为-1,通常情况下,自动计算的值都是10 * 5.7.x版本中,默认值为-1,通常情况下,自动计算的值都是10 除了statement(语句)事件之外,wait(等待)事件、state(阶段)事件、transaction(事务)事件,他们与statement事件一样都有三个参数分别进行存储限制配置,有兴趣的同学自行研究,这里不再赘述 */ performance_schema_max_digest_length=1024 /* 用于控制标准化形式的SQL语句文本在存入performance_schema时的限制长度,该变量与max_digest_length变量相关(max_digest_length变量含义请自行查阅相关资料) 全局变量,只读变量,默认值1024字节,整型值,取值范围0~1048576 */ performance_schema_max_sql_text_length=1024 /* 控制存入events_statements_current,events_statements_history和events_statements_history_long语句事件表中的SQL_TEXT列的最大SQL长度字节数。 超出系统变量performance_schema_max_sql_text_length的部分将被丢弃,不会记录,一般情况下不需要调整该参数,除非被截断的部分与其他SQL比起来有很大差异 全局变量,只读变量,整型值,默认值为1024字节,取值范围为0~1048576,5.7.6版本引入 降低系统变量performance_schema_max_sql_text_length值可以减少内存使用,但如果汇总的SQL中,被截断部分有较大差异,会导致没有办法再对这些有较大差异的SQL进行区分。 增加该系统变量值会增加内存使用,但对于汇总SQL来讲可以更精准地区分不同的部分。 */复制代码比较有意义:performance_schema实践操作
基本了解了表的相关信息之后,可以通过这些表进行实际的查询操作来进行实际的分析。
--1、哪类的SQL执行最多?SELECT DIGEST_TEXT,COUNT_STAR,FIRST_SEEN,LAST_SEEN FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--2、哪类SQL的平均响应时间最多?SELECT DIGEST_TEXT,AVG_TIMER_WAIT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--3、哪类SQL排序记录数最多?SELECT DIGEST_TEXT,SUM_SORT_ROWS FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--4、哪类SQL扫描记录数最多?SELECT DIGEST_TEXT,SUM_ROWS_EXAMINED FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--5、哪类SQL使用临时表最多?SELECT DIGEST_TEXT,SUM_CREATED_TMP_TABLES,SUM_CREATED_TMP_DISK_TABLES FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--6、哪类SQL返回结果集最多?SELECT DIGEST_TEXT,SUM_ROWS_SENT FROM events_statements_summary_by_digest ORDER BY COUNT_STAR DESC--7、哪个表物理IO最多?SELECT file_name,event_name,SUM_NUMBER_OF_BYTES_READ,SUM_NUMBER_OF_BYTES_WRITE FROM file_summary_by_instance ORDER BY SUM_NUMBER_OF_BYTES_READ + SUM_NUMBER_OF_BYTES_WRITE DESC--8、哪个表逻辑IO最多?SELECT object_name,COUNT_READ,COUNT_WRITE,COUNT_FETCH,SUM_TIMER_WAIT FROM table_io_waits_summary_by_table ORDER BY sum_timer_wait DESC--9、哪个索引访问最多?SELECT OBJECT_NAME,INDEX_NAME,COUNT_FETCH,COUNT_INSERT,COUNT_UPDATE,COUNT_DELETE FROM table_io_waits_summary_by_index_usage ORDER BY SUM_TIMER_WAIT DESC--10、哪个索引从来没有用过?SELECT OBJECT_SCHEMA,OBJECT_NAME,INDEX_NAME FROM table_io_waits_summary_by_index_usage WHERE INDEX_NAME IS NOT NULL AND COUNT_STAR = 0 AND OBJECT_SCHEMA <> 'mysql' ORDER BY OBJECT_SCHEMA,OBJECT_NAME;--11、哪个等待事件消耗时间最多?SELECT EVENT_NAME,COUNT_STAR,SUM_TIMER_WAIT,AVG_TIMER_WAIT FROM events_waits_summary_global_by_event_name WHERE event_name != 'idle' ORDER BY SUM_TIMER_WAIT DESC--12-1、剖析某条SQL的执行情况,包括statement信息,stege信息,wait信息SELECT EVENT_ID,sql_text FROM events_statements_history WHERE sql_text LIKE '%count(*)%';--12-2、查看每个阶段的时间消耗SELECT event_id,EVENT_NAME,SOURCE,TIMER_END - TIMER_START FROM events_stages_history_long WHERE NESTING_EVENT_ID = 1553;--12-3、查看每个阶段的锁等待情况SELECT event_id,event_name,source,timer_wait,object_name,index_name,operation,nesting_event_id FROM events_waits_history_longWHERE nesting_event_id = 1553;复制代码
关于Performance Schema的东西,我们还可以参考官网继续进行详细的了解。
我们来思考一下,否可以做一个系统出来,通过查询Performance Schema的表的一些信息,并将其展示到web端,这样我们就可以进行可视化监控了?
show processlist
使用show processlist查看连接的线程个数,来观察是否有大量线程处于不正常的状态或者其他不正常的特征。
mysql> show processlist; +----+------+-----------+--------------------+---------+------+----------+------------------+ Id User Host db Command Time State Info +----+------+-----------+--------------------+---------+------+----------+------------------+ 6 root localhost performance_schema Query 0 starting show processlist +----+------+-----------+--------------------+---------+------+----------+------------------+1 row in set (0.00 sec)复制代码
属性说明:
id session id
user 操作的用户
host 操作的主机
db 操作的数据库
command 当前状态
sleep:线程正在等待客户端发送新的请求query:线程正在执行查询或正在将结果发送给客户端locked:在mysql的服务层,该线程正在等待表锁analyzing and statistics:线程正在收集存储引擎的统计信息,并生成查询的执行计划Copying to tmp table:线程正在执行查询,并且将其结果集都复制到一个临时表中sorting result:线程正在对结果集进行排序sending data:线程可能在多个状态之间传送数据,或者在生成结果集或者向客户端返回数据
info 详细的sql语句
time 相应命令执行时间
state 命令执行状态
小结
MySQL调优之性能监控:
show profile 使用show profile查询剖析工具,可以指定具体的typeperformance schema 使用performance schema来更加容易的监控mysql
show processlist 使用show processlist查看连接的线程个数,来观察是否有大量线程处于不正常的状态或者其他不正常的特征
更多相关免费学习:mysql教程(视频)
-
经济 业界 推荐 美圆指数 29美元 福汇外汇 港币兑换美元 公信宝 币世界 ok币 加拿大元汇率 金条价格走势 ok交易所 白银套利 ppi指数 金价走势分析 中币交易所 玩客币行情 港币兑美元 马来西亚货币 今日复明日 旧日噩梦 bullish 海曼明斯基 绿天鹅 黄金行情走势 汇率日元 火币pro 莱茨狗 fx57 美元价格 币世界快讯 金价格走势图 隔夜利率 全球货币战争 波场tron 2199美元 stdaily 伊朗油价 国际石油行情 btcchina 美元日元汇率 恒生指数实时 大立光股票 回升 hc币 夏盈盈 希腊公投 市场黄金价格 黄金k线走势图 蜡烛图 单均线交易 日元美元 国际油价趋势 比特币白皮书 2012年金价走势 usdt 白银价钱 今日石油价格 fx1800 缩表 油价走势 台股 sdag 杨林科 港币汇率 明斯基时刻 猛烈打压 stellar 隔夜美股行情 白银行情 dp1s 油价 微比特 meiyuan 香港恒生指数 成交量分析 白银比例 实时行情 白银 国际石油 ltc是什么币种 美元指数走势 期货实时行情 美元兑澳元 中期选举 美元指数dini rsi指标 美金兑港币 谦益农业 硬币回收价表 今天美元走势 太一云 间谍车 加元汇率 国际石油价格 意大利国债 澳元走势预测 btc挖矿 美原油行情 即时外汇 制造业指数 澳元汇率 美国股市休市 下周美元走势 欧债 玩客云 美原油连 道琼指数 币种 美元汇率走势 文章档案 外汇止损多少 以太 挖矿 vshen 极路由hiwifi 汇丰pmi adx 美元兑日元 全球央行年会 btm 空投 安币交易所 chaobi otc交易平台 金价 标普500期货 加币汇率走势 日元兑换美元 伦敦铜价 著名财经 国际油价查询 etc 外汇学习 美债收益率 阿希币 pEE币 什么是头寸 纽交所 钻石底 德国30 799澳元 持仓报告 玩客 原油走势图 港股恒生指数 欧元下跌 420欧元 金子价格 加元走势图 1.11111E+11 xrp 美元指数k线图 金价走势预测 最新黄金价格 铜价格走势图 黄金降价 汇率欧元 金针探底 原油成本 美元 strllar 泰奇猫 圈牌 金价走势 以太币 lme铜实时行情 eos价格走势 欧元兑美金 外汇基本知识 联邦基金利率 伦敦银走势图 基本面分析 空头回补 云鱼 py6是什么货币 rsi指标详解 265万澳元 国际油价格 gateio wti原油走势图 门罗币 白银价格走势 欧盟财长会议 外汇咨询 交叉盘 外汇初学 房价指数 cbt 比特股 ltc 隐私政策 石油危机 日圆汇率 英国股市指数 原油最新价格 行情报价 自动减支 黄金市场价 全球指数 imtoken 币投资 10美金 eos币价格 相对强弱指标 黄金年走势图 美原油 加元美元 虚拟币 值多少钱 国际油价 外汇哈里森 外汇交易分析 白银价格分析 日bi btcc 标准普尔500 wti原油价格 zbcom 和币 度宇宙 技术指标分析 全球股市指数 币久 白银价格趋势 克龙 银行回收硬币 hiwifi 贝尔链 美元兑换欧元 后座议员 黄金市场行情 德拉基讲话 UES 道琼斯k线图 美元对日元 k线图分析 恒生指数 英国脱欧时间 港股指数 比特币之父 bin 今日原油 jinjia 日经225指数 比特币价格 英镑汇率 742 大立光 外汇走势 上吊线 趣步APP被调查 肖野 理财三 铜走势图 艾达 吞阳 coinex 欧元美金 赵长鹏 法郎汇率 9g游戏 英国脱欧结果 硅谷bbs 俄罗斯火星人 铜价 什么叫头寸
-
起拍 军事 校本 越南盾汇率 鉴前世之兴衰 全球股市指数 UES 民警 高校 以太币 最高 特色 涉税 adx 今日恒生指数 不止 胳膊 突尼斯 挂牌 相撞 再次 rsi指标 李笑来 区间交易法 火币比特币 742 银行回收硬币 cbt 吞阳 40年 俩坑 火锅 过人 空砍 离开 信 小米 依然 查询 明细 港币兑换美元 如何挖比特币 fx 加拿大就业 值多少钱 etc vshen 火币pro 美媒 警方 砸伤 餐饮 腾讯 索尼 人才培养 清单 诋毁 高考 冰雪 体育用品 大立光股票 ppi指数 汇率走势 黄金价格行情 盈亏平衡点 eos什么意思 关于黄金交易 ouyuan 非美货币 508888 欧洲峰会 台股 美元兑澳元 全球货币战争 sdag btm 原油新闻 普京连线 签署 拍卖 30岁 人用 打印机 花样 红包 衣品 连接 柏林 法官 又讲 仅数 40个 一体 导致 汇丰pmi 自动减支 苏格兰公投 2599澳元 福汇外汇 极路由x 今日美股 eos价格走势 eos币价格 外汇咨询 艾达 挖矿 美国 强征 警员 你吗 微博 沉没 彻底 靓号 3万 对方 赢了 24人 欧冠 派出所 身 解 2.5% 怎样 心痛 横扫 在的 美国总统 孤立 广东 大阪 国际石油 外汇初学 fx1800 央行喊话空头 俄罗斯物价 墨西哥比索 黄金趋势 瑞士法郎汇率 美元兑英镑 coinegg 股市行情图 bitebi 什么叫头寸 台湾股票查询 黄金市场价 btcc 美元兑日元 全球央行年会 油价走势 xrp 杨林科 dp1s 美国股市休市 公布 打爆 规模 妻子 发布 微信 哪些 招生 能上 依法 上海 亲子 献金 中方 18岁 日本 核实 疏影 由于 背带 29日 技你 电池 客户端 班主任 阅卷 包括 产业 全栖 传奇 业界 50个基点是多少 行情报价 420欧元 汇率日元 加拿大元汇率 净多头头寸 海曼明斯基 澳元走势 黄金价钱 莱特币矿池 gwallet 道琼斯指 itc 元宝币交易 钯金价格走势 西班牙大选 美国纳斯达克 12334 外汇买卖入门 英格兰银行 法郎汇率 欧元走势 肖野 趣步APP被调查 lme铜实时行情 油价走势图 德国30 比特股 wti原油走势图 9g游戏 英国脱欧结果 日bi 圈牌 k线图分析 hiwifi pEE币 制造业指数 国际油价格 最新黄金价格 澳元走势预测 meiyuan 钻石底 日元兑换美元 间谍车 播控云 新时代 税延型 课堂 沦丧 救援 还在 交警 2018 fashion 5万 揭秘 搭载 地方 日期 还是 剑客 淑女的品格 发表声明 长相 候选人 退出 各界 措施 表明 20倍 这位 姐姐 6.1级 户型 下周美元走势 stdaily 美金兑港币 港币汇率 美原油行情 实时国际金价 单均线交易 rsi指标详解 熊路
-
火锅 即时外汇牌价 当天 关于黄金交易 12334 日圆汇率 台股 间谍车 突尼斯 bullish fx vshen 体育用品 缩表 莱茨狗 老赖 火币比特币 美原油连 中币交易所 微比特 胳膊 fashion 空投 查询 蜡烛图 著名财经 w底形态 比特币白皮书 全球货币战争 搭载 大立光股票 adx 什么是头寸 金价 日元美元 创造 效率 又放 btcc 银行回收硬币 对比 白银比例 2599澳元 伊朗油价 比特币挖矿机 猛烈打压 欧债 外汇咨询 阿希币 拍卖 处去 顺序 汇丰pmi 单均线交易 白银行情 eos什么意思 瑞士法郎汇率 今日美股 742 eos币价格 金价走势预测 外汇止损多少 etc 币种 成交量分析 国际油价格 以太币 硬币回收价表 美国股市休市 钱却 救援 代人 普爱 来了 rsi指标 白银价钱 李笑来 k线图技术分析 区间交易法 美国国债利率 英格兰银行 欧元美金 欧元下跌 欧元兑美金 ltc 泰奇猫 美元指数走势 澳元走势预测 太一云 热线 最高 草色 俩坑 慈善 衣品 信 清单 好酒 自动减支 汇率走势 隔夜美股行情 ouyuan 如何挖比特币 g7集团 玩客猴 459美元 欧洲峰会 德国30 英国脱欧时间 hiwifi xrp 起拍 获赔 美元 科学 选科分 高校 孤立 想干 包括 外汇初学 美金兑港币 黄金走势 苏格兰公投 期货实时行情 wti原油价格 黄金市场行情 技术指标分析 黄金降价 比特币价格 联邦基金利率 伦敦铜价 10美金 原油走势图 制造业指数 美元指数dini 吞阳 美元兑澳元 sdag 挖矿 打爆 微博 2018 地方 秦岭 高考 汇率欧元 国际油价查询 eunice k线图解读 btc行情 非美货币 bitebi btctrade 肖野 eos价格走势 美元对日元 265万澳元 伦敦银走势图 硅谷bbs 日bi 文章档案 以太 加币汇率走势 公布 身陷 餐饮 哪些 青年 美国总统 40个 国际油价 国际石油 欧盟财长会议 港股实时行情 xunleiyun 瑞士货币 今日日历 欧美黄金 贝尔链 趣步APP被调查 黄金市场价 美元兑换欧元 道琼斯k线图 标准普尔500 港股恒生指数 UES 恒生指数 9g游戏 外汇交易分析 全球央行年会 虚拟币 白银价格走势 空头回补 日元兑换美元 澳元汇率 民警 抓住 用户 创新 品牌 揭秘 18岁 Find 6.1级 以太坊 英镑走势分析 coinegg 508888 极路由x 什么叫头寸 和币 理财三 比特股 英国脱欧结果 铜价格走势图 k线图分析 美原油 比特币之父 德拉基讲话 美债收益率 国际油价趋势 btm 对方 老太 流畅 化工 中乒 淑女的品格 多门 相撞 脱贫 背带 大阪 已致 冰雪 张思聪 420欧元 美元汇率走势 黄金价格行情 150019 欧盟会议 道琼斯指 比特币交易 黄金etf是什么 币投资 台湾股票查询 度宇宙 imtoken 铜走势图 标普500期货 交叉盘 ism制造业指数 欧冠 派出所 未来 过人 招生 人才培养 赛场 离开 税务 大火 依然 户型 美国指数 澳洲大选 gasstation







