본문 바로가기
공부/Mysql

[RealMysql 8.0] 실행 계획 10 ~ 1편 끝

by 띵커베르 2023. 2. 27.
728x90
  • 참고: https://jeong0427.tistory.com/43
  • 실행 계획 확인
    • 8.0 버전부터는 explain 명령에 사용할 수 있는 새로운 옵션이 추가됐다.
    • 쿼리의 실행 시간 확인
      • explin analyze
  • 실행 계획 분석
    • id 칼럼
      • 하나의 select 문장은 다시 1개 이상의 sub select 문장을 포함할 수 있다.
      • 여러개의 테이블이 조인되는 경우에는 id 값이 증가하지 않고 같은 id 값이 부여된다.
      • id 칼럼이 테이블의 접근 순서를 의미하지는 않는다.
      • explain format=tree 명령으로 확인해보면 순서를 더 정확히 알 수 있다.
    • select_type 칼럼
      • select 쿼리가 어떤 타입의 쿼리인지 표시되는 칼럼이다.
        • simple
          • union 이나 서브쿼리를 사용하지 않는 단순한 select 쿼리
          • 쿼리 문장이 아무리 복잡하더라도 실행 계획에서 simple 단위 쿼리는 하나만 존재한다.일반적으로 제일 바깥 sleect 쿼리의 select_type이 simple로 표시된다.
        • primary
          • union 이나 서브쿼리를 가지는 select 쿼리의 실행 계획에서 가장 바깥쪽에 있는 단위 쿼리는 select_type이 primary로 표시된다.
          • simple 과 마찬가지로 단위 쿼리는 하나만 존재하며 쿼리의 바깥쪽에 있는 select 단위 쿼리가 primary로 표시된다.
        • union
          • union 으로 결합하는 단위 select 쿼리 가운데 첫 번째를 제외한 두 번째 이후 단위 select 쿼리는 union 으로 표시된다.
          • union all 의 첫 번째 쿼리는 derived 라는 select_type 을 가진다.
        • dependent union
          • union 이나 union all로 결합된 단위 쿼리가 외부 쿼리에 의해 영향을 받는 것을 의미
        • union result
          • union 결과를 담아두는 테이블을 의미한다.
          • 8.0 이전 버전에는 union all 이나 union 쿼리는 모두 임시 테이블을 생성했는데 8.0 부터는 union all 의 경우 임시 테이블을 사용하지 않도록 기능이 개선됐다.
          • 하지만 union(또는 union distinct)은 mysql 8.0 버전에서도 여전히 임시 테이블에 결과를 버퍼링 한다.
          • union result 는 실제 쿼리에서 단위 쿼리가 아니기 때문에 별도의 id 값은 부여되지 않는다.
        • subquery
          • select_type 의 subquery는 from 절 이외에서 사용되는 서브쿼리만을 의미한다.
        • dependent subquery
          • 서브쿼리가 바깥쪽(Outer) select 쿼리에서 정의된 칼럼을 사용하는 경우, select_type에 dependent subquery 라고 표시된다.
        • derived
        • dependent derived
        • uncacheable subquery
        • uncacheable union
        • materialized
      • table 칼럼
        • mysql 서버의 실행 계획은 단위 select 쿼리 기준이 아니라 테이블 기준으로 표시된다.
      • partition 칼럼
      • type 칼럼
      • posiible_keys 칼럼
        • 사용될법했던 인덱스의 목록(선택 가능한 인덱스)
      • key 칼럼
        • 실제 사용한 인덱스를 의미
      • key_len 칼럼
        • 인덱스의 각 레코드에서 몇 바이트까지 사용했는지 알려주는 값
      • ref 칼럼
        • 참조 조건으로 어떤 값이 제공됐는지 보여준다.
        • 상숫값을 지정했다면 ref 칼럼의 값은 const로 표시되고, 다른 테이블의 칼럼값으면 칼럼명으로 표시된다.
      • rows 칼럼
        • 각 처리 방식이 얼마나 많은 레코드를 읽고 비교해야 하는지 예측해서 비용을 산정한다.
        • 실행 계획의 효율성을 판단을 위해 예측했던 레코드 건수를 보여준다.
      • filtered 칼럼
        • 조건절에 맞게 필터링된 행 수의 비율
      • extra 칼럼
        • 추가 정보 (옵티마이저가 실행 계획을 만드는 과정에서 고려한 다른 요인들)
        • const row not found
          • const 접근 방법으로 테이블을 읽었지만 실제로 해당 테이블에 레코드가 1건도 존재하지 않을때 나타난다.
        • Deleting all rows
          • where 조건절이 없는 delete 문장의 실행 계획에서 자주 표시되며, 이 문구는 테이블의 모든 레코드를 삭제하는 핸들러 기능(api)을 한번 호출함으로써 처리됐다는 것을 의미한다.
        • Distint
          • 중복 없이 유니크하게 가져오기 위한 쿼리다.
          • distint를 처리하기위해 조인하지 않아도 되는 항목은 모두 무시하고 꼭 필요한 것만 조인했으며, 꼭 필요한 레코드만 읽었다는것을 표현한다.
        • ..
      • 종류가 너무 많고 지금 다 알 필요가 없어 위 상단의 url을 참고하거나, 필요시 책을 살펴봐야 할듯하다.
728x90

댓글