어떤 경우에 인덱스를 사용하도록 유도할지, 또는 사용하지 못하게 할지 판단하려면 MySQL이 어떻게 인덱스를 이용해서 실제 레코드를 읽어 내는지 알고 있어야 할것이다.

인덱스 레이지 스캔

인덱스 레인지 스캔은 인덱스의 접근 방법 가운데 가장 대표적인 접근 방식으로, 나머지 2가지 접근 방식보다는 빠른 방법이다.

여기서는 인덱스 B-Tree의 필요한 영역을 스캔하는데 어떤 작업이 필요한지만 이해할 수 있으면 충분할 것이다.

SELECT * FROM employees WHERE first_name BETWEEN 'Ebbe' AND 'Gad';

인덱스 레인지 스캔은 검색해야할 인덱스의 범위가 결정됐을 때 사용하는 방식이다. 검색하려는 값의 수나 검색 결과 레코드 건수와 관계없이 레인지 스캔이라고 표현한다.

위 그림에서 알수 있듯이 루트 노드에서부터 비교를 시작해 브랜치 노드를 거치고 최종적으로 리프 노드까지 찾아 들어가야만 비로소 실제로 원하는 비교를 시작 지점을 찾을수 있다. 일단 시작해야 할 위치를 찾으면 그떄부터는 리프 노드의 레코드만 순서대로 읽는다. 만약 스캔하다가 리프노드 끝까지 읽으면 리프 노드간의 링크를 이용해 다음 리프 노드를 찾아서 다시 스캔한다.

그리고 최종적으로 스캔을 멈춰야 할 위치에 다다르면 지금까지 읽은 레코드를 사용자에게 반환하고 쿼리를 끝낸다.

인덱스 풀 스캔

인덱스 레인지 스캔과 마찬가지로 인덱스를 사용하지만 인덱스 레인지 스캔과는 달리 인덱스의 처음부터 끝까지 모두 읽는 방식을 인덱스 풀 스캔이라고 한다. 대표적으로 쿼리의 조건절에 사용된 컬럼이 인덱스 첫 번째 컬럼이 아닌경우 인덱스 풀 스캔 방식이 사용된다.

일반적으로 인덱스의 크기는 테이블의 크기보다 작으므로 직접 테이블을 처음부터 끝까지 읽는 것보다는 인덱스만 읽는 것이 효율적이다. 쿼리가 인덱스에 명시된 컬럼만으로 조건을 처리할 수있는 경우 주로 이방식이 사용된다. 인덱스 뿐만이 아니라 데이터 레코드까지 모두 읽어야 한다면 절대 이방식으로 처리되지 않는다.

루스 인덱스 스캔

오라클과 같은 DBMS의 인덱스 스킵 스캔 이라고 하는 기능과 작동 방식은 비슷하지만 MySQL에서는 이를 루스 인덱스 스캔이라고 한다.

위에 소개한 두 가지 접근 방법과는 상반된 의미에서 타이트 인덱스 스캔으로도 분류한다. 루스 인덱스 스캔이란 말 그래도 느슨하게 또는 듬성듬성하게 인덱스를 읽는 것을 의미한다.

루스 인덱스 스캔은 인덱스 레인지 스캔과 비슷하게 작동하지만, 중간마다 필요치 않은 인덱스 키값은 무시하고 다음으로 넘어가는 형태로 처리한다. 일반적으로 GROUP BY 또는 집합 함수 가운데 MAX() 또는 MIN() 함수에 대해 최적화를 하는 경우에 사용된다.