RealMySQL 9.1-9.2.3.1

흑이·2023년 6월 1일
0

MySQL에서 쿼리를 최적으로 실행하기 위해 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업을 옵티마이저가 한다.


쿼리 실행 절차

  1. 파싱
  • 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다.

    SQL 파서라는 모듈로 처리한다.
    SQL 파스 트리가 만들어 진다.


  1. 최적화 및 실행 계획 수립
  • SQL 파싱 정보(파스 트리)를 확인하면서 어떤 테이블로부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
  • 옵티 마이저에서 처리 한다.

풀 테이블 스캔, 풀 인덱스 스캔

  • InnoDB 스토리지 엔진은 특정 테이블의 연속된 데이터 페이지가 읽히면 백그라운드 스레드에 의해 리드 어헤드 작업이 자동으로 시작된다.

  • 리드 어헤드란 어떤 영역의 데이터가 앞으로 필요해지리라는 것을 예측해서 요청이 오기 전에 미리 디스크에서 읽어 InnoDB의 버퍼 풀에 가져다 두는 것을 의미한다.

  • 포그라운드 스레드는 미리 버퍼 풀에 준비된 데이터를 가져다 사용하기만 하면 되므로 쿼리가 빨리 처리된다.

  • 리드 어헤드는 풀 인덱스 스캔에도 동일하게 사용된다.


병렬 처리

  • 병렬 처리는 하나의 쿼리를 여러 스레드가 작업을 나누어 동시에 처리하는 것을 의미한다.

  • MySQL 8.0 에서는 아무런 where 조건 없이 단순히 테이블의 전체 건수를 가져오는 쿼리만 병렬로 처리할 수 있다.
    ex. SELECT COUNT(*) FROM employees;

  • 병렬 처리용 스레드 개수를 CPU 코어 개수보다 크게 설정하면 성능이 떨어진다.


ORDER BY 처리 (Using file sort)

  • 정렬을 처리하는 방법에는 인덱스를 이용하는 방법과 쿼리가 실행될때 FileSort 라는 별도의 처리를 이용하는 방법이 있다.

소트 버퍼

  • MySQL은 정렬을 수행하기 위해 소트 버퍼라는 별도의 메모리 공간을 할당받아 사용한다.

  • 소트 버퍼는 정렬이 필요한 경우에만 할당되는 가변적인 공간이며, 쿼리 실행이 완료되면 즉시 반납된다.

  • 정렬해야 할 레코드 건수가 소트 버퍼 공간보다 크다면, 레코드를 여러 조각으로 나눠서 처리하는데, 이때 임시 저장을 위해 디스크를 사용한다. 정렬하고 병합하는 과정에서 디스크 읽기, 쓰기가 유발된다.

  • 소트 버퍼를 크게 설정하면 더 빨라질것 같지만, 소트 버퍼는 세션 메모리이므로 클라이언트마다 할당되는 공간이라 크게 설정하면 메모리 부족 현상을 겪을 수도 있다.

0개의 댓글