性能分析工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能分析工具相关的知识,希望对你有一定的参考价值。
- 查看系统性能参数
SHOW [GLOBAL|SESSION] STATUS LIKE 参数;
Connections:连接mysql服务器的次数。
Uptime:MySQL服务器的上线时间。
Slow_queries:慢查询的次数。
Innodb_rows_read:Select查询返回的行数
Innodb_rows_inserted:执行INSERT操作插入的行数
Innodb_rows_updated:执行UPDATE操作更新的行数
Innodb_rows_deleted:执行DELETE操作删除的行数
Com_select:查询操作的次数。
Com_insert:插入操作的次数。对于批量插入的INSERT操作,只累加一次。
Com_update:更新操作的次数。
Com_delete:删除操作的次数。
- 统计sql查询成本
show status like last_query_cost;
# 返回结果为SQL语句所需要读取的页的数量
- 慢查询日志定义
MySQL的慢查询日志,用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
long_query_time的默认值为10,意思是运行10秒以上(不含10秒)的语句,认为是超出了我们的最大忍耐时间值。
它的主要作用是,帮助我们发现那些执行时间特别长的SQL查询,并且有针对性地进行优化,从而提高系统的整体效率。当我们的数据库服务器发生阻塞、运行变慢的时候,
检查一下慢查询日志,找到那些慢查询,对解决问题很有帮助。比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合explain进行全面分析。
默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定
的性能影响。
慢查询日志支持将日志记录写入文件。
- 设置慢查询日志
#查询慢查询是否已经开启
show variables like %slow_query_log%;
#修改为开启状态
set global slow_query_log = on
#查询阈值
show variables like %long_query_time%
#修改阈值,全局和本次连接都需要设置
set global long_query_time = 1;
set session long_query_time = 1;
- 查看慢查询数目
show global status like %Slow_queries%;
- 代码案例
# 创建表
CREATE TABLE `student` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`stuno` INT NOT NULL ,
`name` VARCHAR(20) DEFAULT NULL,
`age` INT(3) DEFAULT NULL,
`classId` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 报错时,设置为允许创建存储函数
set global log_bin_trust_function_creators=1;
# 创建存储函数,随机产生字符串
DELIMITER //
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
DECLARE chars_str VARCHAR(100) DEFAULT
abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ;
DECLARE return_str VARCHAR(255) DEFAULT ;
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
SET i = i + 1;
END WHILE;
RETURN return_str;
END //
DELIMITER ;
#测试
SELECT rand_string(10);
# 创建存储函数,生成随机数值
DELIMITER //
CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(from_num +RAND()*(to_num - from_num+1)) ;
RETURN i;
END //
DELIMITER ;
# 测试:
SELECT rand_num(10,100);
# 创建存储过程
DELIMITER //
CREATE PROCEDURE insert_stu1( START INT , max_num INT )
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0; #设置手动提交事务
REPEAT #循环
SET i = i + 1; #赋值
INSERT INTO student (stuno, NAME ,age ,classId ) VALUES
((START+i),rand_string(6),rand_num(10,100),rand_num(10,1000));
UNTIL i = max_num
END REPEAT;
COMMIT; #提交事务
END //
DELIMITER ;
# 调用存储过程,生成数据
CALL insert_stu1(100001,4000000);
# 查询表中的数据
SELECT * FROM student WHERE stuno = 3455655;
SELECT * FROM student WHERE name = oQmLUr;
# 再次查看慢查询数目,有2条
show global status like %Slow_queries%;
- 慢查询日志分析工具:mysqldumpslow
- 查看帮助
mysqldumpslow --help
-a: 不将数字抽象成N,字符串抽象成S
-s: 是表示按照何种方式排序:
c: 访问次数
l: 锁定时间
r: 返回记录
t: 查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间 (默认方式)
ac:平均查询次数
-t: 即为返回前面多少条的数据;
-g: 后边搭配一个正则匹配模式,大小写不敏感的;
- 代码案例
# 在日志文件中,查看 慢查询的sql语句
mysqldumpslow -s t -t 5 /var/lib/mysql/atguigu01-slow.log
#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
#另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more
- 永久关闭慢查询日志
# 修改my.cnf或者my.ini文件,把[mysqld]组下的slow_query_log值设置为OFF,修改保存后,再重启MySQL服务,即可生效;
# 重启后查看
SHOW VARIABLES LIKE %slow%; # 查询慢查询日志所在目录
SHOW VARIABLES LIKE %long_query_time%; # 查询超时时长
- 临时关闭慢查询日志
# 命令关闭
SET GLOBAL slow_query_log=off;
# 重启MySQL服务
- 删除慢查询日志
# 显示慢查询日志信息
show variables like slow_query_log;
# 手动删除慢查询日志文件
#重新生成新的查询日志文件
mysqladmin -uroot -p flush logs slow
-
其他方式查看执行慢的sql语句
# 查看sql执行成本是否开启
show variables like profiling;
# 开启
set profiling = ON;
# 查看查询语句
show profiles;
# 查看开销
show profile;
#查看指定sql语句的开销
show profile cpu,block io for query 2;
以上是关于性能分析工具的主要内容,如果未能解决你的问题,请参考以下文章