b

6장 실행 계획 ( 6.1 개요 ) 본문

RealMysql

6장 실행 계획 ( 6.1 개요 )

dev.bistro 2012. 10. 19. 18:14


* 지은이의 말

  사람들이 NoSQL에 상당한 관심을 가지고 있지만, 실제로는 몽고DB나 카산드라같이 유명한하고 사용처는 많지 않다. 사용하더라도, 성능에 대해 괴로움이 많다고 한다.

  지은이도 관심을 가지는 Hbase를 포함한 NoSQL은 INSERT,UPDATE 쓰기 동작이 빠르지만, MySQL의 SELECT 조회처럼 퍼모먼스를 내긴 어렵다. 이처럼 명백하게 나뉜다.



* 초급 내용

  6장, 7장, 8장, 9장, 11장, 13장, 14장, 15장, 16장




6장. 실행계획


6.1 개요


6.1.1 쿼리 실행 절차

 MySQL 실행되는 과정

  1. SQL파싱 단계 : SQL문장을 잘게 쪼개 MySQL이 이해할 수 있는 수준으로 분리 

     MySQL 파서 모듈이 수행한다

     문법 오류는 여기서 걸러지고. SQL파스트리가 생성된다.

  

  2. 최적화 및 실행 계획 수립 단계 : SQL의 파스트리를 확인하면서 어떤 테이블, 어떤 인덱스를 쓸지 선택.

     MySQL 옵티마이저가 수행한다.

     연산의 단순화 및  사용 테이블, 사용 인덱스 결정  임시 테이블의 사용유무 체크 등등


  3. 결정된 테이블, 인덱스를 이용해 데이터를 가져온다.


6.1.2 옵티마이저 종류

 1. 비용기반 최적화(Cost-based optimizer , CBO) : 현제 대부분의 DBMS가 선택

    여러 실행 계획 수립, 예측을 통해 계획별 비용을 산출 최소 비용이 소요되는 방식을 선택한다.


 2. 규칙기반 최적화(Rule-based optimizer, RBO) : 예전 오라클

    대상 테이블의 크기, 선택도등 고려하지 않음

    옵티마이저 내부 규칙에 따라 실행 계획 수립 -> 같은 쿼리는 거의 같은 실행 방법을 만든다.


6.1.3 통계정보

    통계정보는 비용기반 최적화(CBO) 에서 가장 중요한것이다.

    MySQL의 통계정보는 다른DBMS보다 다양하지 않다. 기본적으로 레코드건수, 인덱스의 유니크 수 정도 (오라클의 통계 정보는 방대해서 따로 백업하기도 한다)

    


    레코드건수가 많지 않으면 통계 정보가 부정확한 경우가 많으므로 "ANALYZE"명령을 이용해 강제적으로 통계 정보를 갱신할 때도 있다. 


    통계정보 확인

     MyISAM : SHOW TABLE STATUS LIKE 'tb_test'\G

     InnoDB : SHOW INDEX FROM tb_test

    통계정보 갱신

     일반 테이블 통계 정보 수집 : ANALYZE TABLE tb_test;

     특정 파티션의 통계 정보 수집 : ALTER TABLE tb_test ANALYZE PARTITION p3;

    ANALYZE실행중

     MyISAM : 읽기 가능, 쓰기 불가능   // 전체 스캔 많인 시간이 소요 

     InnODB : 읽기, 쓰기 모두 불가능 (즉 서비스 도중에는 ANALYZE를 수행하지 마라) // 인덱스 페이지중 8개 정도만 랜덤 선택 분석하고 인덱스의 통계 정보로 갱신 (5.1.38이후는 셋팅가능)


P233 ~ P236

Comments