type
이후의 칼럼은 MySQL 서버가 각 테이블의 레코드를 어떤 방식으로 읽었는지를 나타낸다.type
칼럼은 반드시 체크해야 할 중요한 정보다.type
칼럼을 “조인 타입”으로 소개한다.type
칼럼을 “조인 타입”이라고 명시하고 있다.type
칼럼의 값은 조인과 직접 연관 지어 생각하지 말고, 각 테이블의 접근 방법(Access type)으로 해석하면 된다.type
칼럼에 표시될 수 있는 값은 현재 많이 사용되는 대부분의 버전에서 거의 차이 없이 다음과 같이 표시된다.index_merge
를 제외한 나머지 접근 방법은 하나의 인덱스만 사용한다.💡 동등 비교 연산자
동등 비교 연산자는 “=” 또는 “<=>”을 의미한다. “<=>” 연산자는 NULL에 대한 비교 방식만 조금 다를 뿐 “=”와 같은 연산자다.
type
칼럼의 값이 ALL 또는 index로 표시될 가능성이 크다.const
라고 한다.ref
로 표시된다.eq_ref
라고 한다.type
칼럼에 eq_ref
가 표시된다.NOT NULL
이어야 한다.const
나 eq_ref
보다는 빠르지 않지만, 동등한 조건으로 비교되므로 매우 빠른 레코드 조회 방법의 하나.const
, eq_ref
, ref
가 아니면 일반적으로 전문 인덱스를 사용하는 조건을 선택해서 처맇ㄴ다.MATCH (...) AGAINST (...)
구문을 사용해서 실행하는데, 이때 반드시 해당 테이블에 전문 검색용 인덱스가 준비돼 있어야만 한다.fulltext
)보다 일반 인덱스를 이용하는 접근 방법(range
)이 더 빨리 처리되는 경우가 많았다.ref
방식 또는 NULL 비교(IS NULL
) 접근 방법을 의미한다.ref
접근 방법과 같은데, NULL 비교가 추가된 형태IN(subquery)
형태의 쿼리를 위한 접근 방법이다.IN(subquery)
형태의 세미 조인을 최적화하기 위한 많은 기능이 도입되어서, 실제로는 더 최적화된 다른 실행 계획이 보일 것이다.IN(subquery)
형태의 조건에서 서브쿼리가 중복된 값을 반환할 수 있지만, 인덱스를 이용해서 제거할 수 있을 때 사용되는 접근 방법이다.IN(subquery)
또는 IN(상수 나열)
형태의 조건은 괄호 안에 있는 값의 목록에서 중복된 값이 먼저 제거되어야 한다.<, >, IS NULL, BETWEEN, IN, LIKE
등의 연산자를 이용해 인덱스를 검색할 때 사용된다.const, ref, range
라는 세 가지 접근 방법을 모두 묶어서 지칭한다.range
접근 방법보다 효율성이 떨어진다.index_merge
가 적용되지 않는다.index_merge
접근 방법으로 처리된 결과는 항상 2개 이상의 집합이 되기 때문에, 그 두 집합의 교집합이나 합집합, 또는 중복 제거와 같은 부가적인 작업이 더 필요하다.index_merge
접근 방법이 사용될 때는 실행 계획에 조금 더 보완적인 내용이 표시된다.range
나 const
, ref
같은 접근 방법으로 인덱스를 사용하지 못하는 경우LIMIT
조건이 없거나 가져와야 할 레코드 건수가 많아지면 상당히 느린 처리를 수행한다.index
와 ALL
접근 방법은 작업 범위를 제한하는 조건이 아니므로, 빠른 응답을 사용자에게 보내야 하는 웹 서비스 등과 같은 온라인 트랜잭션 처리 환경에는 적합하지 않다.💡 리드 어헤드 (Read Ahead)
다른 DBMS와 같이 InnoDB도 풀 테이블 스캔이나 인덱스 풀 스캔과 같은 대량의 디스크 I/O를 유발하는 작업을 위해 다음과 같이 한꺼번에 많은 페이지를 읽어 들이는 기능을 제공한다.
인접한 페이지가 연속해서 몇 번 읽히면 백그라운드로 작동하는 읽기 스레드가 최대 64개의 페이지씩 한꺼번에 디스크를 읽어 들여서, 상당히 빠르게 레코드를 읽을 수 있다.
이러한 작동 방식을 “리드 어헤드”라고 하며,
innodb_read_ahead_threshold
시스템 변수와innodb_random_read_ahead
시스템 변수를 이용해 리드 어헤드를 언제 실행할지 제어할 수 있다.