• MySQL-索引优化分析


    一、慢查询日志(默认没有开启

    MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句

    如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响,慢查询日志支持将日志记录写入文件。

    show variables like '%slow_query_log%'   #查看是否开启慢查询日志,默认禁用
    set global slow_query_log=1;      #设置慢查询日志开启,只对当前数据库生效,MySQL重启后会失效
    
    show variables like '%long_query_time%';  #查看慢于多少秒会被记录到日志文件(默认10s)
    set global long_query_time=3;  #设置慢查询阈值时间
    
    show global status like '%slow_queries%';  #查询当前系统中有多少条慢查询日志

    若要永久生效,必须修改配置文件my.cnf,然后重启服务器

    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/sql_idx_slow.log   #系统默认会给一个缺省的文件{host_name}-slow.log
    long_query_time=3; 
    log_output=FILE

    二、慢查询日志分析工具mysqldumpslow 

    mysqldumpslow --help
    
    mysqldumpslow -s -r -t 10  /var/lib/mysql/hadoop102-slow.log #得到返回记录集最多的10个SQL
    
    mysqldumpslow -s -r -t 10  /var/lib/mysql/hadoop102-slow.log | more #结合|和more使用
    
    mysqldumpslow -s t -t 10 -g “left join” /var/lib/mysql/hadoop102-slow.log #得到按时间排序的前10条里面含有左连接的查询语句   

    三、批量导入数据

    创建函数若报错 This function has none of DETERMINISTIC

    由于开启过慢查询日志,开启了binlog,必须为function指定一个参数

    show variables like '%log_bin_trust_function_creators%'  
    set global log_bin_trust_function_creators = 1  

    永久生效,修改/etc/my/cnf文件添加 log_bin_trust_function_creators = 1 

    创建函数:

    1、随机生成字符串 

    DELIMITER $$
    CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
    BEGIN
      DECLARE char_str VARCHAR(100) DEFAULT 'abcdABCD';
      DECLARE return_str VARCHAR(255) DEFAULT '';
      DECLARE i INT DEFAULT 0;
      WHILE i<n DO
      SET return_str=CONCAT(return_str,SUBSTRING(char_str,FLOOR(1+RAND()*8),1));
      SET i=i+1;
      END WHILE;
      RETURN return_str;
    END $$
    

    2、随机生成编号 

    DELIMITER $$
    CREATE FUNCTION rand_num() RETURNS INT(5)
    BEGIN
      DECLARE i INT DEFAULT 0;
      SET i=FLOOR(100+RAND()*10);
      RETURN i;
    END $$  

    执行存储过程  

    DELIMITER $$
    CREATE PROCEDURE insert_tb1_emp(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 tbl_emp(id,name,deptId) VALUES
    ((START+i),rand_string(10),rand_num());
    UNTIL i=max_num
    END REPEAT;
    COMMIT;
    END $$   

    调用存储过程

    DELIMITER ;
    CALL insert_tb1_emp(100,10);

    四、show profile(默认关闭,并保存最近15次的运行结果

    MySQL提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于SQL调优的测量。

     1、默认关闭,使用前需要开启

    show variables like '%profiling%'; 
    set profiling=on;  #开启  

    2、运行SQL后,查看结果

    show profiles
    

    3、诊断SQL

    show profile cpu,block io for query 问题SQL数字号码  

    日常开发需要注意的结论

    • converting HEAP to MyISAM 查询结果太大,内存不够用往磁盘搬
    • Creating tmp table 创建临时表
    • Copy to tmp table on disk 把内存中临时表复制到磁盘,非常危险
    • locked 

    五、全局日志查询(永远不要在生产环境开启这个功能)

    1、配置启用

    在mysql的my.cnf中,设置如下

    general_log=1  #开启
    general_log_file=/path/logfile  #记录日志文件的路径
    log_output=FILE  #输出格式
    

    2、编码启用

    set global general_log=1;
    set global log_output='TABLE'; 
    

    3、此后所编写的sql语句,将会记录到mysql库中的general_log表中

    select * from mysql.general_log;  

      

      

     

  • 相关阅读:
    计算某天的下一天:黑盒测试之等价类划分+JUnit参数化测试
    黑盒测试之因果图法
    黑盒测试之等价类划分
    JUnit白盒测试之基本路径测试:称重3次找到假球
    Java实现称重3次找到假球
    用pymysql和Flask搭建后端,响应前端POST和GET请求,实现登录和注册功能
    【算法与数据结构】包含负数的基数排序
    【机器学习实战】第六章--支持向量机
    【机器学习实战】第四章朴素贝叶斯
    【算法与数据结构】--经典排序算法Python实现
  • 原文地址:https://www.cnblogs.com/wjh123/p/11216492.html
Copyright © 2020-2023  润新知