실행 계획은 SQL을 처리하기 위해 옵티마이저가 선택한 테이블 접근 방식, 인덱스, 조인 순서와 조인 알고리즘 등의 계획입니다. MySQL에서는 EXPLAIN으로 예상 실행 계획을 확인하고, EXPLAIN ANALYZE로 쿼리를 실제 실행하여 예상치와 실제 처리 행 수 및 시간을 비교할 수 있습니다.

MySQL의 전통적인 EXPLAIN 결과는 다음 순서로 살펴볼 수 있습니다.

  1. 테이블 접근 순서: 출력된 테이블과 id를 통해 어떤 순서로 읽는지 확인합니다.
  2. type: const, eq_ref, ref, range, index, ALL 등 접근 방식을 봅니다. 일반적으로 ALL은 전체 테이블 스캔, index는 전체 인덱스 스캔을 의미합니다.
  3. possible_keys와 key: 사용할 수 있었던 인덱스와 실제 선택된 인덱스를 비교합니다.
  4. key_len과 ref: 복합 인덱스의 어느 부분을 사용했고 어떤 값과 비교하는지 확인합니다.
  5. rows와 filtered: 읽을 것으로 예상한 행 수와 조건을 통과할 비율을 봅니다. 앞 단계의 행 수가 다음 조인에서 반복되므로 전체 작업량을 함께 판단해야 합니다.
  6. Extra: Using index, Using temporary, Using filesort 등 추가 작업을 확인합니다.

특정 항목 하나만 보고 느린 쿼리라고 단정하면 안 됩니다. 작은 테이블의 전체 스캔은 합리적일 수 있고, Using filesort도 반환 건수가 적다면 큰 문제가 아닐 수 있습니다. 반대로 예상 행 수와 실제 행 수의 차이가 크면 통계가 부정확하거나 컬럼 간 상관관계를 옵티마이저가 잘못 추정했을 가능성이 있습니다.

출처 및 참고자료