性能监控
show profiles
show profile默认是关闭的,并且开启后只存活于当前会话,也就说每次使用前都需要开启
使用前开启:set profiling=1
再使用show profiles
所有语句以及对应的执行时间
查看某条语句具体执行的所有信息:show profile all for query query_id
all:所有信息(cpu,block…)
show processlist
查看数据库的连接信息
Performance schema
默认是开启的
mysql系统会创建名为performance_schema
的数据库,用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况
其中包含87张表,表中的数据不会存入磁盘而是在内存中存储
,这些表大概可以分为以下几类:
show tables like '%statement%';
语句事件记录表,这些表记录了语句事件信息,当前语句事件表events_statements_current、历史语句事件表events_statements_history和长语句历史事件表events_statements_history_long、以及聚合后的摘要表summary,其中,summary表还可以根据帐号(account),主机(host),程序(program),线程(thread),用户(user)和全局(global)再进行细分)
show tables like '%wait%';
等待事件记录表,与语句事件类型的相关记录表类似:
show tables like '%stage%';
–阶段事件记录表,记录语句执行的阶段事件的表
show tables like '%transaction%';
–事务事件记录表,记录事务相关的事件的表
show tables like '%file%';
–监控文件系统层调用的表
show tables like '%memory%';
–监视内存使用的表
show tables like '%setup%';
–动态对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;
索引监控
show status like '%handler_read%'
Handler_read_first 8 #通过index获取索引的次数
Handler_read_key 10 #读取索引第一个条目的次数
Handler_read_last 0 #读取索引最后一个条目的次数
Handler_read_next 96 #通过索引读取下一条数据的次数
Handler_read_prev 0 #通过索引读取上一条数据的次数
Handler_read_rnd 5 #从固定位置读取数据的次数
Handler_read_rnd_next 4306#从数据节点读取下一条数据的次数
Handler_read_key和Handler_read_rnd_next的值越高越好
日志
redolog、undolog
这两个日志是innodb引擎独有的,就是能够支持事务
redolog:记录的是对数据的修改(增删改)操作;保证事务的持久性(事务提交后还没落盘就宕机,重启后根据redolog重新落盘)
循环写
:读写文件都是先写进日志缓冲区、再写入内核缓冲区、最后写入磁盘中;当磁盘文件写满后会覆盖之前的信息,以便于写入最新的日志记录
redoLog贺=和binLog保证数据持久性
1、事务开启后DML语句更新数据到内存
2、开始写入redoLog写入磁盘,将状态设为prepare
3、写binLog文件到磁盘
4、事务提交后将redoLog状态改为commit
undolog:当有数据被修改时(增删改),会做一个备份;保证事务的原子性,做回滚;
也是将数据先写入内存缓冲区再写入磁盘中
使用undolog实现多版本并发控制(MVCC)
innodb_flush_log_at_trx_commit
:innodb将log buffer数据写入文件并flush到磁盘中的时间点
innodb_log_buffer_size
:日志文件内存缓冲区大小
innodb_log_file_size
:日志文件大小 m为单位
binlog
binlog是数据库server层的,不管是用什么数据库引擎都会有
记录的是对数据的修改(增删改)的全量数据,以二进制方式存储,当超过设定binlog文件大小会自动生成一个新的binlog文件
默认是关闭的
可以配置成指定的数据库开启binlog
log_bin
:参数指定binlog文件存放位置+名称
使用
数据备份、主从复制
慢查询日志
当sql语句的执行时间超过设定的值视为慢查询语句,开启后会记录慢查询语句
查看设定的慢查询时间值
show variables like 'long_query_time
#开启慢查询
set slow_query_log=on
mysql配置文件参数:
slow_query_log
:是否开启慢查询日志记录
slow_query_log_file
:指定慢查询日志记录文件名
long_query_time
:设定慢查询时间