一、慢日志查询

1、参数

  • log_output:
    • 日志输出到哪儿,默认FILE,表示文件;设置成TABLE,则将日志记录到mysql.slow_log中。也可设置多种格式,比如 FILE,TABLE
  • long_query_time:
    • 执行时间超过这么久才记录到慢查询日志,单位秒,可使用小数表示小于秒的时间
  • log_queries_not_using_indexes:
    • 是否要将未使用索引的SQL记录到慢查询日志中,此配置会无视long_query_time的的配置。生产环境建议关闭;开发环境建议开启。
  • log_throttle_queries_not_using_indexes:
    • 和log_queries_not_using_indexes配合使用,如果log_queries_not_using_indexes打开,则该参数将限制每分钟写入的、未使用索引的SQL数量。
  • min_examined_row_limit:
    • 扫描行数至少达到这么多才记录到慢查询日志
  • log_slow_admin_statements:
    • 是否要记录管理语句,默认关闭。管理语句包括ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE。
  • slow_query_log_file:
    • 指定慢查询日志文件路径
  • log_slow_extra:
    • 当log_output=FILE时,是否要记录额外信息(MySQL 8.0.14开始提供),对log_output=TABLE的结果无影响。
 

2、使用方式

方式一、修改配置文件my.cnf,在[mysqld]段落中加入如上参数即可
需要重启
[mysqld]
# ...
log_output = 'FILE,TABLE';
slow_query_log = ON
long_query_time = 0.001

 

 
方式二、通过全局变量设置
这种方式无需重启即可生效,但一旦重启,配置又会丢失。
set global log_output = 'FILE,TABLE';
set global slow_query_log = 'ON';
set global long_query_time =0.001;

 

 

3、分析

当log_output = TABLE时,可直接用如下语句分析:
select * from `mysql`.slow_log

 

当log_output = FILE时,可使用mysqldumpslow分析
➜ mysqldumpslow --help
Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]

Parse and summarize the MySQL slow query log. Options are

  --verbose    verbose
  --debug      debug
  --help       write this text to standard output

  -v           展示更详细的信息
  -d           debug
  -s ORDER     以哪种方式排序,默认at
                al: 平均锁定时间
                ar: 平均返回记录数
                at: 平均查询时间
                 c: 访问计数
                 l: 锁定时间
                 r: 返回记录
                 t: 查询时间
  -r           将-s的排序倒序
  -t NUM       top n的意思,展示最前面的几条
  -a           不去将数字展示成N,将字符串展示成'S'
  -n NUM       abstract numbers with at least n digits within names
  -g PATTERN   后边可以写一个正则,只有符合正则的行会展示
  -h HOSTNAME  慢查询日志以 主机名-slow.log的格式命名,-h可指定读取指定主机名的慢查询日志,默认情况下是*,读取所有的慢查询日志
  -i NAME      MySQL Server的实例名称(如果使用了mysql.server startup脚本的话)
  -l           不将锁定时间从总时间中减去

 

 

二、SQL性能分析

1、SHOW PROFILE

  • 格式
SHOW PROFILE [type [, type] ... ]
    [FOR QUERY n]
    [LIMIT row_count [OFFSET offset]]

type: {
    ALL                     显示所有信息
  | BLOCK IO                显示阻塞的输入输出次数
  | CONTEXT SWITCHES显示自愿及非自愿的上下文切换次数
  | CPU显示用户与系统CPU使用时间
  | IPC显示消息发送与接收的次数
  | MEMORY显示内存相关的开销,目前未实现此功能
  | PAGE FAULTS显示页错误相关开销信息
  | SOURCE列出相应操作对应的函数名及其在源码中的位置(行)
  | SWAPS显示swap交换次数
}

 

  • 开关
select @@have_profiling; 0表示未启用,1表示已启用,
开启:set profiling = 1;
-- 默认展示15条
show profiles

-- 使用profiling_history_size调整展示的条目数
set profiling_history_size = 100;

 

  • 分析查询
mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | Query                    |
+----------+----------+--------------------------+
|        0 | 0.000088 | SET PROFILING = 1        |
|        1 | 0.000136 | DROP TABLE IF EXISTS t1  |
|        2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 rows in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating table       | 0.000056 |
| After create         | 0.011363 |
| query end            | 0.000375 |
| freeing items        | 0.000089 |
| logging slow query   | 0.000019 |
| cleaning up          | 0.000005 |
+----------------------+----------+
7 rows in set (0.00 sec)

-- 默认情况下,只展示Status和Duration两列,如果想展示更多信息,可指定type。
mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| query end          | 0.000107 |
| freeing items      | 0.000008 |
| logging slow query | 0.000015 |
| cleaning up        | 0.000006 |
+--------------------+----------+
4 rows in set (0.00 sec)

-- 展示CPU相关的开销
mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 |   0.000002 |
| creating table       | 0.000056 | 0.000028 |   0.000028 |
| After create         | 0.011363 | 0.000217 |   0.001571 |
| query end            | 0.000375 | 0.000013 |   0.000028 |
| freeing items        | 0.000089 | 0.000010 |   0.000014 |
| logging slow query   | 0.000019 | 0.000009 |   0.000010 |
| cleaning up          | 0.000005 | 0.000003 |   0.000002 |
+----------------------+----------+----------+------------+
7 rows in set (0.00 sec)

 

 
2、INFORMATION_SCHEMA.PROFILING
INFORMATION_SCHEMA.PROFILING用来做性能分析。它的内容对应SHOW PROFILE和SHOW PROFILES 语句产生的信息
3、PERFORMANCE_SCHEMA
PERFORMANCE_SCHEMA是MySQL建议的性能分析方式,未来SHOW PROFILE、INFORMATION_SCHEMA.PROFILING都会废弃。据笔者研究,PERFORMANCE_SCHEMA在MySQL 5.6引入,因此,在MySQL 5.6及更高版本才能使用
 

三、数据库诊断命令

1、SHOW PROCESSLIST

SHOW FULL PROCESSLIST 等价于 SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST
SHOW [FULL] PROCESSLIST用于查看当前正在运行的线程。如果执行此命令的用户拥有 PROCESS 权限,则可看到所有线程;否则只能看到自己的线程(即与当前登录用户关联的线程)。如果不使用FULL关键字,只在Info字段中展示前100个字符。
使用场景:
当遇到“too many connections”错误信息时,想要了解发生了什么,SHOW PROCESSLIST就非常有用。可使用kill 语句杀死异常线程。
字段说明:
  • Id:连接的唯一标识,是CONNECTION_ID()函数的返回
  • User:发出该语句的MySQL用户
    • system_user表示服务器产生的非客户端线程,用于处理内部任务。这可能是用来在从库复制或延迟行处理器的IO/SQL线程。对于system_user,Host字段将会为空
    • unauthenticated user是指与客户端连接,但尚未完成客户端用户身份认证的线程
    • event_scheduler是指事件调度器的监控线程
  • Host:发出该语句的客户端的主机名(当User是system_user时,Host为空)。TCP/IP链接的主机名以 host_name:client_port 格式上报,以便更轻松地了解哪个客户端在干什么。
  • db:当前执行的命令是在哪一个数据库上。如果没有指定数据库,则值为NULL
  • Command:当前线程正在执行的命令
    • Binlog Dump:主库上的线程,用于将binlog内容发送到从库
    • Change user:线程正在执行更改用户操作
    • Close stmt:线程正在关闭一个prepared statement
    • Connect:一个复制从库已连接到其主库
    • Connect Out:一个复制从库正在连接到其主库
    • Create DB:线程正在执行create-database操作
    • Daemon:服务器内部线程,而非为客户端连接提供服务的线程
    • Debug:该线程正在生成调试信息
    • Delayed insert:该线程是延迟插入处理程序
    • Drop DB:线程正在执行drop-database操作。
    • Error
    • Execute:线程正在执行一个prepared statement
    • Fetch:正在从Prepared Statement 中获取执行结果
    • Field List:该线程正在获取表的字段信息
    • Init DB:线程正在选择默认数据库
    • Kill:该线程正在杀死另一个线程
    • Long Data:正在从prepared statement中检索long data
    • Ping:线程正在处理server-ping请求
    • Prepare:该线程正在准备一个prepared statement
    • Processlist:该线程正在生成服务器线程相关信息
    • Query:线程正在执行一条语句
    • Quit:线程正在终止
    • Refresh:该线程是刷新表,日志或缓存;或者正在重置状态变量或在复制服务器信息
    • Register Slave:该线程正在注册一个从库
    • Reset stmt:线程正在重置prepared statement
    • Set option:线程正在设置或重置client statement-execution选项
    • Shutdown:线程正在关闭服务器
    • Sleep:线程正在等待客户端向其发送statement
    • Statistics:该线程正在生成服务器状态信息
    • Table Dump:线程正在将表内容发送到从属服务器
 
  • Time:线程处于当前状态的时间(单位秒)。对于从库的SQL线程,该字段的值表示上次复制事件的时间和从库机器的实际时间之间经过了多少秒
  • State:指示线程正在执行的操作、事件或状态。大多数State对应于非常快速的操作。如果线程在给定状态下很久,则需要排查下。
  • Info:当前线程正在执行的语句,如果未执行任何语句则值为NULL。该语句可能是发送到服务器的那条语句,也可能是内部的语句(如果某个语句执行了其他语句)。例如一条CALL语句执行了一条正在执行SELECT语句的存储过程,则Info字段会展示SELECT语句。
 
INFORMATION_SCHEMA.PROCESSLIST 表的应用SQL
-- 按照客户端IP分组,看哪个客户端的连接数最多
select client_ip, count(client_ip) as client_num
from (select substring_index(host, ':', 1) as client_ip
      from `information_schema`.processlist) as connect_info
group by client_ip
order by client_num desc;

-- 查看正在执行的线程,并按 Time 倒排序,看看有没有执行时间特别长的线程
select *
from `information_schema`.processlist
where Command != 'Sleep'
order by Time desc;

-- 找出所有执行时间超过 5 分钟的线程,拼凑出 kill 语句,方便后面查杀
select concat('kill ', id, ';')
from `information_schema`.processlist
where Command != 'Sleep'
  and Time > 300
order by Time desc;

 

参考:
 

2、其他命令

  • SHOW STATUS
  • SHOW VARIABLES
  • SHOW TABLE STATUS
  • SHOW INDEX
SHOW INDEX FROM mydb.mytable;
  • SHOW ENGINE
 
posted @ 2023-02-20 22:18 windge 阅读(50) 评论(0) 推荐(0) 编辑
摘要: 一、explain必备知识 1.type取值 性能从好到坏排序如下 system:该表只有一行(相当于系统表),system是const类型的特例 const:针对主键或唯一索引的等值查询扫描, 最多只返回一行数据. const 查询速度非常快, 因为它仅仅读取一次即可 eq_ref:当使用了索引的 阅读全文
posted @ 2023-02-18 21:12 windge 阅读(63) 评论(0) 推荐(0) 编辑
摘要: 以下内容只针对innodb,mysql版本基于5.6 一.join优化 1、优化算法 优化算法了解:嵌套循环-NLJ(Nested-Loop Join)、块嵌套循环-BNLJ(Block Nested-Loop Join)、MRR(mUlti Range Read)、批量键值访问-BKA(Batch 阅读全文
posted @ 2023-02-18 21:10 windge 阅读(70) 评论(0) 推荐(0) 编辑
摘要: 一、长字段索引优化 1、额外创建一个hash字段,作为索引(B+tree的伪hash) hash算法应满足(一般使用crc32或fnv64): a、字段长度应该比较小(SHA1/MD5不合适) b、尽量避免hash冲突 示例:select * from t_goods where name = 'w 阅读全文
posted @ 2023-02-12 21:29 windge 阅读(36) 评论(0) 推荐(0) 编辑
摘要: 一、创建索引的原则 1、建议创建索引的场景 where语句的查询条件 select语句,对于某些字段经常作为 where语句的查询条件; Update/delete语句的where条件频繁使用时的字段 需要分组、排序的字段 distinct所使用的字段 如果字段的值,有唯一性约束,要创建唯一索引 对 阅读全文
posted @ 2023-02-12 14:44 windge 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 一、InnoDB和MyISAM的存储方式 1、InnoDB存储方式 使用的B+Tree数据结构,物理存储角度是聚簇索引 对于主键索引: 叶子节点会存储主键以及主键所对应数据块的指针; 对应非主键索引(二级索引、辅助索引):叶子节点存储索引以及这条数据对应的主键;需要先通过非主键索引查到主键,然后通过 阅读全文
posted @ 2023-02-11 20:31 windge 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 一、启动回调 应用场景: 1.启动前环境检测? 2.启动时配置初始化? 3.启动后数据初始化? 类型 注入方式 回调时机 总体回调顺序 应用场景 ApplicationContextInitializer spring.factories 等3种 IOC容器初始化时被回调 1 启动前环境检测 Spr 阅读全文
posted @ 2022-08-14 09:51 windge 阅读(783) 评论(0) 推荐(0) 编辑
摘要: 1.如何载入启动类的@SpringBootApplication注解? org.springframework.boot.BeanDefinitionLoader#load(java.lang.Class<?>) org.springframework.boot.BeanDefinitionLoad 阅读全文
posted @ 2022-08-12 18:27 windge 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 1.BeanFactory与ApplicationContext关系区别 ​Spring 框架IOC 容器的核心接口是BeanFactory和ApplicationContext。BeanFactory是 IOC 容器的最基本版本,ApplicationContext在BeanFactory的基础上 阅读全文
posted @ 2022-08-12 18:25 windge 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 一、核心流程 加载bean定义 实例化 1.执行Before实例化BeanPostProcessor.postProcessBeforelnstantiation 2.执行构造方法 3.执行After实例化BeanPostProcessor.postProcessAfterInstantiation 阅读全文
posted @ 2022-08-11 22:05 windge 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 解析源码版本:spring-boot-1.5.7.RELEASE,spring-framework-4.3.11.RELEASE 一、整体流程 1.初始化:初始化器和监听器 org.springframework.boot.SpringApplication#initialize 2.启动监听器 S 阅读全文
posted @ 2022-08-11 21:57 windge 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 一、漏洞重现 Win10系统执行以下代码,弹出计算器,其中btyecodes执行的代码是 Runtime.getRuntime().exec("calc"); public class FastJsonBugTest { static { ParserConfig.getGlobalInstance 阅读全文
posted @ 2022-06-08 19:27 windge 阅读(5560) 评论(0) 推荐(0) 编辑
摘要: 官网:https://rocketmq.apache.org/ 源码地址:https://github.com/apache/rocketmq 一、RocketMQ的优点 1、天然支持集群模式、负载均衡、水平扩展能力 2、上亿级别的消息堆积能力 3、采用零拷贝的原理、顺序写盘、随机读(借鉴kafka 阅读全文
posted @ 2022-05-04 22:55 windge 阅读(315) 评论(0) 推荐(0) 编辑
摘要: 源码地址:https://github.com/apache/rocketmq-dashboard dashboard是rocket的运维后台管理,下面简单介绍界面 1.配置项OPS namesvr可修改 2.整体消息情况Dashboard 3.集群信息Cluster 进来一条,出去可能多条,因为可 阅读全文
posted @ 2022-05-04 21:30 windge 阅读(672) 评论(0) 推荐(0) 编辑
摘要: 一、安装清单 NameServer和BokerServer 下载地址:https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.3 RocketMQ Dashboard 下载地址: https://github.com/apac 阅读全文
posted @ 2022-05-04 20:30 windge 阅读(925) 评论(0) 推荐(0) 编辑
摘要: 操作示例的安装版本:3.6.5 一、准备 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc tz 阅读全文
posted @ 2022-04-05 21:13 windge 阅读(120) 评论(0) 推荐(0) 编辑
摘要: RabbitMQ是一个开源的消息代理和队列服务器,基于AMQP协议,RabbitMQ高性能的原因之一是因为基于Erlang语言开发,Erlang语言有着和原生Socket一样好的低延迟。 官网:https://www.rabbitmq.com/ 一、AMQP核心概念 Server:又称Broker, 阅读全文
posted @ 2022-04-05 10:00 windge 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 一、git批量删除分支 批量删除远程分支示例 git branch -a| grep 'bak.hotfix_1.36.1.1*' |xargs -n1 -d'/' | grep 'bak.hotfix_1.36.1.1*' | xargs git push origin --delete 小技巧: 阅读全文
posted @ 2021-11-03 20:19 windge 阅读(1300) 评论(0) 推荐(0) 编辑
摘要: 一、一句话归纳 分类 设计模式 简述 一句话归纳 目的 生活案例 创建型设计模式 (简单来说就是用来创建对象的) 工厂模式(Factory Pattern) 不同条件下创建不同实例 产品标准化,生产更高效 封装创建细节 实体工厂 单例模式(Singleton Pattern) 保证一个类仅有一个实例 阅读全文
posted @ 2021-04-07 13:00 windge 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式 一、简单工厂模式 简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”,如果要创建的产品不多,只要一个简单工厂类就可以完成。 1.优点和缺点 优点: 工厂类包 阅读全文
posted @ 2021-04-03 16:38 windge 阅读(95) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示