MySQL 조회 캡 처 에 대한 심도 있 는 분석

1.조회 최적화
1.my sql 의 튜 닝 대강
  • 느 린 조회 의 오픈 과 캡 처
  • explain+느 린 SQL 분석
    show profile 은 SQL 이 Mysql 서버 에서 의 실행 세부 사항 과 생명주기 상황 을 조회 합 니 다
  • SQL 데이터베이스 서버 의 매개 변수 변조
  • 2,작은 시계 구동 큰 시계
    my sql 의 join 실현 원 리 는 구동 표 의 데 이 터 를 바탕 으로'끼 워 넣 기 순환'이 구동 표 에 일치 하 는 기록 을 하 는 것 이다.드라이버 의 색인 은 효력 을 잃 고 드라이버 의 색인 은 유효 합 니 다.
    
    #   a 10000  ,b 20  
    select * from a join b on a.bid =b.id
    
    a   b  :
    for 20   
       10000  (  on a.bid=b.id     ,  B+   )
         :20+ log10000
    b   a  
    for 10000   
       20   (  on a.bid=b.id     ,  B+   )     :10000+ log20
    3,in 과 exists
    exists 사용
  • EXISTS 문법:EXISTS(subquery)는 TRUE 나 FALSE 만 되 돌려 주기 때문에 하위 조회 의 SELECT*도 SELECT 1 또는 기타 일 수 있 습 니 다.공식 적 으로 는 실제 실행 시 SELECT 목록 을 무시 하기 때문에 차이 가 없습니다.
  • SELECT ... FROM table WHERE EXISTS(subquery)
  • 이 문법 은 조회 한 데 이 터 를 하위 조회 에 넣 어 조건 검증 을 하고 검증 결과(TRUE 또는 FALSE)에 따라 주 조회 의 데이터 결과 가 보존 되 는 지 여 부 를 결정 하 는 것 으로 이해 할 수 있다
  • EXISTS 서브 조회 의 실제 집행 과정 은 우리 가 이해 하 는 조목조목 대비 하 는 것 이 아니 라 최적화 되 었 을 수 있 으 며 효율 문 제 를 우려 하면 효율 적 인 문 제 를 확인 하기 위해 실제 검 사 를 할 수 있다
  • EXISTS 서브 조 회 는 흔히 조건 식,다른 서브 조회 또는 JOIN 으로 대체 할 수 있 는데 어떤 것 이 가장 좋 은 지 구체 적 인 문 제 를 구체 적 으로 분석 해 야 한다
  • 
    #  in  ,  B    A
    select * from A where id in (select id from B)
    #  exists  ,  A    B
    select * from A where exists(select 1 from B where B.id = A.id)
    결론:
    
              
      B        A      ,   in
      A        B      ,   exist
    4,orderby 생 성 표
    
    create table tblA(
     #id int primary key not null auto_increment,
     age int,
     birth timestamp not null
    );
    
    insert into tblA(age, birth) values(22, now());
    insert into tblA(age, birth) values(23, now());
    insert into tblA(age, birth) values(24, now());
    #      
    create index idx_A_ageBirth on tblA(age, birth);

    orderby 명중 색인 의 경우

    orderby 가 색인 에 명중 하지 않 은 경우
  • MySQL 은 두 가지 정렬 방식 을 지원 합 니 다:Using index 와 Using filesort.filesort 효율 이 낮 고 index 방식 으로 정렬 하려 면 두 가지 사용 조건 을 만족 시 켜 야 합 니 다.가능 한 한 색인 열 에서 정렬 작업 을 완성 하고 색인 의 가장 좋 은 왼쪽 접 두 사 를 따라 야 합 니 다.
    orderby 구문 자체 가 색인 을 사용 하 는 가장 왼쪽 앞줄
  • 4
  • where 자구 와 order by 자구 조건 열 을 사용 하여 최 왼쪽 전열 을 만족 시 킵 니 다
  • orderby 가 색인 열 에 없 으 면 filesort 알고리즘 을 사용 합 니 다.이중 정렬 과 단일 정렬
    4.567917.MySQL 4.1 이전 에는 이중 정렬 을 사 용 했 는데 글자 그대로 디스크 를 두 번 스 캔 하여 데 이 터 를 얻 었 다 는 뜻 이다.줄 포인터 와 orderby 열 을 읽 고 정렬 한 다음 정렬 된 목록 을 스 캔 하고 목록 의 값 에 따라 목록 에서 해당 하 는 데 이 터 를 다시 읽 습 니 다
  • 4.567917.디스크 에서 조회 에 필요 한 모든 열 을 읽 고 order by 열 에 따라 buffer 에 정렬 한 다음 에 정렬 된 목록 을 스 캔 하여 출력 합 니 다.효율 이 빠 르 고 두 번 째 데 이 터 를 읽 지 않 으 며 무 작위 IO 를 순서 IO 로 바 꿉 니 다.그러나 모든 줄 을 메모리 에 저장 하기 때 문 입 니 다
    
    select * from user where name = "zs" order by age
    #    
    1)  name         name = 'zs'    id
    2)     id     ,      age     id         sort buffer(    )  
    3) name        name = 'zs'       id
    4)   2、3       name = 'zs'
    5)  sort_buffer      age     id      age    
    6)       id     age ,   id                       
    
    #    
    1) name        name ='zs'       id
    2)     id     ,        ,   sort_buffer(    ) 
    3)   name        name = 'zs'       id
    4)     2、3       name = 'zs'
    5)  sort_buffer          age     ,        
    단일 정렬 문제 및 최적화
    
      :
               ,        
      sort_buffer ,  B   A        ,    B         ,                 sort_buffer   ,       sort_buffer       ,    (  tmp  ,    ),     sort_buffer    ,  ……        I/O。
        :
       sort_buffer_size     
       max_length_for_sort_data     
        :
      Order by select *     , Query     。                   ,       I/O         。
    5,groupby 최적화
    1)group by 는 실질 적 으로 정렬 한 후 그룹 을 나 누 어 색인 의 가장 좋 은 왼쪽 접 두 사 를 따른다.
    2)색인 열 을 사용 할 수 없 을 때 max 증가length_for_sort_data 매개 변수 설정+증대 sortbuffer_size 매개 변수 설정
    3)where 가 having 보다 높 으 면 where 에 한 정 된 조건 을 쓸 수 있 으 면 having 에 한정 하지 마 세 요.
    4)나머지 규칙 은 모두 order by 와 일치한다
    2.느 린 조회 로그
    1.느 린 조회 로 그 는 무엇 입 니까?
  • MySQL 의 느 린 조회 로 그 는 MySQL 이 제공 하 는 로그 기록 으로 MySQL 에서 응답 시간 이 밸브 값 을 초과 하 는 문 구 를 기록 하 는데 구체 적 으로 운행 시간 이 log 를 초과 하 는 것 을 말한다.query_time 값 의 SQL 은 느 린 조회 로그 에 기 록 됩 니 다
  • long_query_time 의 기본 값 은 10 입 니 다.10 초 이상 실행 되 는 SQL 문 구 는 기 록 됩 니 다
  • 4.567917.그 가 어떤 SQL 이 우리 의 최대 인내 시간 치 를 초과 하 는 지 살 펴 보 자.예 를 들 어 sql 이 5 초 이상 실행 되 더 라 도 우 리 는 SQL 이 느 려 도 5 초 이상 의 sql 을 수집 하고 이전 explain 과 결합 하여 전면적 인 분석 을 하고 자 한다2,느 린 조회 로그 의 오픈
    기본적으로 MySQL 의 느 린 조회 로 그 는 열 리 지 않 았 습 니 다.변조 가 필요 하지 않 으 면 이 인 자 를 시작 하 는 것 을 권장 하지 않 습 니 다.느 린 조회 로 그 를 열 면 성능 에 영향 을 줄 수 있 기 때문에 느 린 조회 로 그 는 로그 기록 을 파일 에 기록 하 는 것 을 지원 합 니 다.
    a)느 린 조회 로그 열기
    
    #         
    show variables like 'slow_query_log%';
    #       ,       my.cnf   
    set global slow_query_log = 1 ;

    b)느 린 조회 로그 의 한도 값 설정
    
    #                10s
    show variables like 'long_query_time%';
    #   3s     ,       my.cnf   
    set global long_query_time = 3
    #    ,        
    show variables like 'long_query_time%';

    c)지속 화 느 린 조회 로그 와 시간 한도 값
    
    [mysqld]
    #        
    slow_query_log=1;
    slow_query_log_file=/var/lib/mysql/hadoop102-slow.log
    long_query_time=3;
    log_output=FILE
    d)느 린 조회 사례
    
    #    4s
    select sleep(4); 
    
    # linux   ,       
    cat /var/lib/mysql/hadoop102-slow.log
    e)현재 시스템 에 존재 하 는 느 린 조회 로그 갯 수 보기
    
    show global status like '%Slow_queries%';
    3,로그 분석 명령 mysqldumpslow
    a)매개 변수 해석
    -s:어떤 방식 으로 정렬 하 는 지
    c:방문 횟수
    l:잠 금 시간
    리 턴 레코드
    t:조회 시간
    al:평균 잠 금 시간
    ar:평균 반환 기록 수
    at:평균 조회 시간
    -t:앞의 몇 개의 데 이 터 를 되 돌려 주기 위해 서 입 니 다.
    -g:뒤쪽 에 정규 일치 모드 를 맞 추고 대소 문자 가 민감 하지 않 습 니 다.
    b)상용 방법
    
    #          10 SQL
    mysqldumpslow -s r -t 10 /var/lib/mysql/hadoop102-slow.log
    #         10 SQL
    mysqldumpslow -s c -t 10 /var/lib/mysql/hadoop102-slow.log
    #          10             
    mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/hadoop102-slow.log
    #        |  more  
    mysqldumpslow -s r -t 10 /var/lib/mysql/hadoop102-slow.log | more
    3.데이터 스 크 립 트 대량 작성
    1.건축 표
    
    CREATE TABLE dept
    (
     deptno int unsigned primary key auto_increment,
     dname varchar(20) not null default '',
     loc varchar(8) not null default ''
    )ENGINE=INNODB DEFAULT CHARSET=utf8;
    
    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.저장 함수 작성 자 를 신뢰 할 수 있 는 지 설정 합 니 다.
    
    #  binlog  
    show variables like 'log_bin%';
    #             
    set global log_bin_trust_function_creators = 1;

    3,생 성 함수
    무 작위 문자열 생 성 함수
    
    #      $$      (     ;)
    delimiter $$ 
    create function rand_string(n int) returns varchar(255)
    begin
     declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
     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 $$
    create function rand_num() returns int(5)
    begin
     declare i int default 0;
     set i=floor(100+rand()*10);
     return i;
    end $$
    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;
     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(),2000,400,rand_num());
     until i=max_num
     end repeat;
     commit;
    end $$
    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 $$
    5.저장 프로 세 스 를 호출 하여 데 이 터 를 생 성 합 니 다.
    
    #       10   
    DELIMITER ;
    CALL insert_dept(100, 10);
    #       50w   
    CALL insert_emp(100001, 500000);
    4.show profiles
    1,소개
    4.567917.show profile 은 my sql 이 현재 세 션 에서 실 행 된 자원 소모 상황 을 분석 할 수 있 도록 제공 합 니 다.SQL 의 변조 측정 에 사용 할 수 있 습 니 다
  • 기본 적 인 상황 에서 매개 변 수 는 닫 힌 상태 이 고 최근 15 번 의 운행 결 과 를 저장 합 니 다
  • 2,오픈
    
    #   Show Profile     
    show variables like ‘profiling%';
    #   Show Profile
    set profiling=on;
    3,show profiles 사용
    테스트 데이터 생 성
    
    select * from emp group by id%10 limit 150000;
    select * from emp group by id%10 limit 150000;
    select * from emp group by id%10 order by 5;
    select * from emp
    select * from dept
    select * from emp left join dept on emp.deptno = dept.deptno
    실행 쇼 프로 파일

    show profile cpu,Block io for query Query 실행ID;

    검색 매개 변수
    ALL:모든 지출 정보 표시
    BLOCK IO:블록 IO 관련 비용 표시
    CONTEXT SWITCHES:상하 문 전환 관련 비용
    CPU:CPU 관련 지출 정보 표시
    IPC:지출 정보 전송 및 수신 표시
    메모리 관련 지출 정보 표시
    PAGE FAULTS:페이지 오류 관련 비용 정보 표시
    SOURCE:디 스 플레이 와 Sourcefunction,Source_file,Source_라인 관련 지출 정보
    SWAPS:교환 횟수 와 관련 된 지출 정 보 를 표시 합 니 다.
    결과 되 돌리 기
    converting HEAP to MyISAM:조회 결과 가 너무 커서 메모리 가 부족 해서 디스크 로 옮 겼 습 니 다.
    Creating tmp table:임시 표를 만 듭 니 다.my sql 은 먼저 데 이 터 를 임시 표 에 복사 한 다음 에 다 쓴 다음 임시 표를 삭제 합 니 다.
    Copying to tmp table on disk:메모리 에 있 는 임시 시 계 를 디스크 에 복사 하면 위험 합 니 다!!
    locked:시계 잠 금
    전역 조회 로그
    생산 환경 설정 에서 사용 하지 마 십시오.
    my.cnf 에 설정
    
    #   
    general_log=1
    #          
    general_log_file=/path/logfile
    #     
    log_output=FILE
    인 코딩 사용
    
    set global general_log=1;
    set global log_output='TABLE';
    설정 이 완료 되면 mysql 라 이브 러 리 에 기 록 된 geneal로그 테이블
    
    select * from mysql.general_log;
    총결산
    여기 서 MySQL 조회 캡 처 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 MySQL 조회 캡 처 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기