天天看点

性能分析工具

性能分析工具
性能分析工具
  • 查看系统性能参数
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;