MySQL의 느린 쿼리 로그와 쇼의 프로필

1. 슬로우 쿼리 로그

1.1 무엇입니까

  (. 1) MySQL의 느린 쿼리 로그는 응답 시간을 기록하는 데 사용됩니다 MySQL을 제공하는 로그, 특히 SQL LONG_QUERY_TIME 실행 시간 값을 초과, MySQL은 임계 값 문을 초과 할 경우, 그것은이 슬로우 쿼리 로그에 기록됩니다 .

  (2) 상세 동작 시간 값의 LONG_QUERY_TIME SQL을 넘으면,이 슬로우 쿼리 로그에 기록한다 말한다. 기본값은 10 초 이상이 문을 실행하는 것을 의미, 10 LONG_QUERY_TIME입니다.

  (3) 심지어 우리 느린 SQL 경우 그 이전에 설명 포괄적 인 분석과 함께 SQL의 5 초 이상을 수집, 희망, SQL은 5 초 이상에 대한 SQL 실행으로, 우리의 인내의 최대 시간 값을 넘어 무엇을 볼 수에 대한.

사용하는 방법 1.2

  기본적으로 MySQL 데이터베이스가 느린 쿼리 로그가 켜지지 않습니다, 우리는 수동으로 매개 변수를 설정해야합니다.

  이 필요한 튜닝은되어 있지 않은 경우 슬로우 쿼리 로그가 다소 느린 쿼리 로그 지원은 파일에 기록 로깅 일부 성능에 미치는 영향을 가져올 열 때문에 물론, 일반적으로 우리는이 기능을 활성화하지 않는 것이 좋습니다.

  (1) 오픈 세트

  • SHOW 변수 '% slow_query_log %'LIKE, 슬로우 쿼리 로그가 켜져 참조하십시오. 슬로우 쿼리 로그를 의미 OFF의 경우 Slow_query_log 기본 값은 사용할 수 없습니다
  • 세트 글로벌 slow_query_log = 1; 슬로우 쿼리 로그에 차례
  • SHOW 변수는 'LONG_QUERY_TIME %'LIKE, 슬로우 쿼리 임계 값은 초 단위로 설정 참조
  • 세트 LONG_QUERY_TIME = 1; 초 슬로우 쿼리 임계 값 설정

  (2) 영구에서 구성 파일 구성 께 my.cnf의 [MySQL의] 수정

slow_query_log = 1

slow_query_log_file =은 / var / lib 디렉토리 / mysql을 / atguigu-slow.log //하면 로그 파일을 작성

LONG_QUERY_TIME = 3 // 느린 SQL 임계 값

log_output = FILE // 로그 파일 형식

  (3) 쿼리 SQL을 실행 속도가 느린 쿼리 로그보기를 설정하는 데 시간이 오래.

1.3 로그 분석 도구 mysqldumpslow

  (1)보기 mysqldumpslow 도움말 정보

    명령 : [루트 @ 누에 고치 ~] # mysqldumpslow --help (리눅스 환경)

    

  (2)보기 mysqldumpslow 도움말 정보

  • 돌아 10 개 개의 레코드를 SQL을 제공하기 위해 설정 :  mysqldumpslow -t -SR (10) C : /mysql/mysql.log
  • 대부분의 시간은 10 SQL에 액세스 할 수 있습니다 :  mysqldumpslow -sc -t 10  C : /mysql/mysql.log
  • 왼쪽에 연결하기는 시간 순서 10 이전에 따라 쿼리를 포함 :

    mysqldumpslow -ST -t 10 -g "왼쪽 가입"/var/lib/mysql/atguigu-slow.log

  • 이러한 명령을 사용하는 경우 외에도 조합을 제안 | 더 사용하거나 화면 발생을 폭발 할 수 있습니다 :

    mysqldumpslow -SR -t 10 /var/lib/mysql/atguigu-slow.log |

2. 대량 데이터 스크립트

1) 내장 테이블 문

CREATE TABLE `dept` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `deptName` VARCHAR(30) DEFAULT NULL, `address` VARCHAR(40) DEFAULT NULL, ceo INT NULL , PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; CREATE TABLE `emp` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `empno` INT NOT NULL , `name` VARCHAR(20) DEFAULT NULL, `age` INT(3) DEFAULT NULL, `deptId` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) #CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2). 设置参数

  在执行创建函数之前,首先请保证 log_bin_trust_function_creators 参数为 1,即 on 开启状态。 否则会报错。

  查询:show variables like 'log_bin_trust_function_creators';

  设置:set global log_bin_trust_function_creators=1;

    当然,如上设置只存在于当前操作,想要永久生效,需要写入到配置文件中:

    在[mysqld]中加上 log_bin_trust_function_creators=1

3).创建函数

3.1 随机产生字符串函数

CREATE FUNCTION `rand_string`(n int) RETURNS varchar(255) CHARSET utf8
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;

3.2 随机产生部门编号

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;

4). 创建存储函数

4.1 创建往 emp 表中插入数据的存储过程

CREATE PROCEDURE `insert_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 emp (empno, NAME ,age ,deptid ) VALUES ((START+i) ,rand_string(6) , rand_num(30,50),rand_num(1,10000));
        until i = max_num
    end repeat;
    commit;
END;

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

CREATE PROCEDURE `insert_dept`(max_num int)
BEGIN
  DECLARE i int DEFAULT 0;
  SET autocommit = 0;
  REPEAT
    SET i = i + 1;
    INSERT
      INTO `dept`
      (`deptname`, `address`, `ceo`)
    VALUES
      (rand_string(8), rand_string(10), rand_num(1, 500000));
  UNTIL i = max_num END REPEAT;
  COMMIT;
END;

5).调用存储过程

#执行存储过程,往 dept 表添加 1 万条数据
DELIMITER ;
CALL insert_dept(10000); 
 
#执行存储过程,往 emp 表添加 50 万
DELIMITER ;
CALL insert_emp(100000,500000); 

3. show profile

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

3.1 分析步骤

  1. 开启Show Profile功能,默认该功能是关闭的,使用前需开启。

   

3.2. 批量导入数据

   上面已做

3.3. 运行SQL,通过show profiles查看结果

  

3.4. 使用show profile对sql语句进行诊断。

 通过上面的图,可以看出,第10条SQL查询的时间很慢。我们就来看看这条SQL语句的执行情况

  

 3.5. show profile的常用查询参数

①ALL:显示所有的开销信息。

BLOCK IO:显示块IO开销。

③CONTEXT SWITCHES:上下文切换开销。

CPU:显示CPU开销信息。

⑤IPC:显示发送和接受开销信息。

MEMORY:显示内存开销信息。

⑦PAGE FAULTS:显示页面错误开销信息。

⑧SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息。

⑨SWAPS:显示交换次数开销信息。

3.6. 需要注意的参数

converting  HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。

Creating tmp table:创建临时表。先拷贝数据到临时表,用完后再删除临时表。

Copying to tmp table on disk:把内存中临时表复制到磁盘上,危险!!!

locked

 show profile诊断结果中出现了以上4条结果中的任何一条,则sql语句需要优化。

总结

#1.show profile默认是关闭的,并且开启后只存活于当前会话,也就说每次使用前都需要开启。如果永久开启修改配置文件

#2.通过show profiles查看sql语句的耗时时间,然后通过show profile命令对耗时时间长的sql语句进行诊断。

#3.注意show profile诊断结果中出现相关字段的含义,判断是否需要优化sql语句。

#4.可更多的关注MySQL官方文档,获取更多的知识。

추천

출처www.cnblogs.com/FondWang/p/12195567.html