Mysql性能截取分析

  1. 慢查询日志:

    MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
     
    具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
     
    由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合之前explain进行全面分析。

    默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。
     
    当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件
     
  2. 查看是否开启及如何开启:

    SHOW VARIABLES LIKE '%slow_query_log%';

    默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启



    set global slow_query_log=1;   用来开启慢查询日期。

    使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,如果MySQL重启后则会失效。

    如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)

    那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢?

    这个是由参数long_query_time控制,默认情况下long_query_time的值为10秒,

    命令:SHOW VARIABLES LIKE 'long_query_time%';



    可以使用命令修改,也可以在my.cnf参数里面修改。
     
    假如运行时间正好等于long_query_time的情况,并不会被记录下来。也就是说,在mysql源码里是判断大于

    long_query_time,而非大于等于。

    查看当前多少秒算慢:SHOW VARIABLES LIKE 'long_query_time%';

    设置慢的阙值时间:set global long_query_time=1,修改为阙值到1秒钟的就是慢sql

    需要重新连接或新开一个会话才能看到修改值。


    查询当前系统中有多少条慢查询记录:show global status like '%Slow_queries%';


     
  3. 日志分析工具mysqldumpslow:

    查看mysqldumpslow的帮助信息: mysqldumpslow --help



    得到返回记录集最多的10个SQL
    mysqldumpslow -s r -t 10 /var/lib/mysql/yang-slow.log
     
    得到访问次数最多的10个SQL
    mysqldumpslow -s c -t 10 /var/lib/mysql/yang-slow.log
     
    得到按照时间排序的前10条里面含有左连接的查询语句
    mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/yang-slow.log
     
    另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
    mysqldumpslow -s r -t 10 /var/lib/mysql/yang-slow.log | more
     
  4. 批量数据脚本:

    1、建表:

    #1 建表dept
    CREATE TABLE dept(  
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,  
    deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,   
    dname VARCHAR(20) NOT NULL DEFAULT "",  
    loc VARCHAR(13) NOT NULL DEFAULT ""  
    ) ENGINE=INNODB DEFAULT CHARSET=UTF8 ;  
     
     
    #2 建表emp
    CREATE TABLE emp  
    (  
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,  
    empno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, /*编号*/  
    ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/  
    job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/  
    mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/  
    hiredate DATE NOT NULL,/*入职时间*/  
    sal DECIMAL(7,2) NOT NULL,/*薪水*/  
    comm DECIMAL(7,2) NOT NULL,/*红利*/  
    deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/  
    )ENGINE=INNODB DEFAULT CHARSET=UTF8 ; 

    2、设置参数log_bin_trust_function_creators:

    创建函数,假如报错:This function has none of DETERMINISTIC......
    # 由于开启过慢查询日志,因为我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
     
    show variables like 'log_bin_trust_function_creators';
     
    set global log_bin_trust_function_creators=1;
     
    # 这样添加了参数以后,如果mysqld重启,上述参数又会消失,永久方法:
     
    windows下my.ini[mysqld]加上log_bin_trust_function_creators=1 
     
    linux下    /etc/my.cnf下my.cnf[mysqld]加上log_bin_trust_function_creators=1

    3、创建函数,保证每条数据都不同:

    随机产生字符串:

    DELIMITER $$
    CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
    BEGIN    ##方法开始
     DECLARE chars_str VARCHAR(100) DEFAULT   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; 
     ##声明一个 字符窜长度为 100 的变量 chars_str ,默认值 
     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));
    ##concat 连接函数  ,substring(a,index,length) 从index处开始截取
     SET i = i + 1;
     END WHILE;
     RETURN return_str;
    END $$
     
    #假如要删除
    #drop function rand_string;

    随机产生部门编号:

     
    #用于随机产生部门编号
    DELIMITER $$
    CREATE FUNCTION rand_num( ) 
    RETURNS INT(5)  
    BEGIN   
     DECLARE i INT DEFAULT 0;  
     SET i = FLOOR(100+RAND()*10);  
    RETURN i;  
     END $$

    #假如要删除
    #drop function rand_num;

    4、创建存储过程:

    创建往emp表中插入数据的存储过程:
     
    DELIMITER $$
    CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))  
    BEGIN  
    DECLARE i INT DEFAULT 0;   
    #set autocommit =0 把autocommit设置成0  ;提高执行效率
     SET autocommit = 0;    
     REPEAT  ##重复
     SET i = i + 1;  
     INSERT INTO emp(empno, ename ,job ,mgr ,hiredate ,sal ,comm ,deptno ) VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),FLOOR(1+RAND()*20000),FLOOR(1+RAND()*1000),rand_num());  
     UNTIL i = max_num   ##直到  上面也是一个循环
     END REPEAT;  ##满足条件后结束循环
     COMMIT;   ##执行完成后一起提交
     END $$
     
    #删除
    # DELIMITER ;
    # drop PROCEDURE insert_emp10000;




    创建往dept表中插入数据的存储过程:

    #执行存储过程,往dept表添加随机数据
    DELIMITER $$
    CREATE PROCEDURE insert_dept(IN START INT(10),IN max_num INT(10))  
    BEGIN  
    DECLARE i INT DEFAULT 0;   
     SET autocommit = 0;    
     REPEAT  
     SET i = i + 1;  
     INSERT INTO dept (deptno ,dname,loc ) VALUES (START +i ,rand_string(10),rand_string(8));  
     UNTIL i = max_num  
     END REPEAT;  
     COMMIT;  
     END $$ 
     
    #删除
    # DELIMITER ;
    # drop PROCEDURE insert_dept;

    5、调用存储过程:

    DELIMITER ;
    CALL insert_dept(100000,500000);   //从编号1000000开始往部门表里插入500000条数据

    CALL insert_emp(100001,500000);  //往用户表里插入 500000万条数据

     
  5. Show Profile:

    是什么:是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量
    默认情况下,参数处于关闭状态,并保存最近15次的运行结果

    1、分析步骤:

    开启功能,默认是关闭,使用前需要开启:

    show variables like 'profiling';


     
    set profiling=1;




    查看结果,show profiles;




    诊断SQL,show profile cpu,block io for query  n  (n为上一步前面的问题SQL数字号码);


     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值