노트
- 예를 들어서 테이블의 DDL 이 다음과 같다고 가정해보자
CREATE TABLE students ( id name grade school )
- 여기서 PK는 기본적으로 당연히 인덱스가 걸려있다. grade=3 인 학생을 조회하기 위한 쿼리는 다음과 같다. 이때, grade는 인덱스가 있다고 가정한다.
SELECT * FROM students WHERE grade = 3;
- 여기서 일차적으로 grade를 조회할때는 grade 값을 빠르게 인덱스로 찾아내지만, 문제는 grade를 제외한
name, school
항목들은 인덱스에 존재하지 않는다. 나머지 항목(name, school
) 은 PK로 다시 실제 데이터가 존재하는 곳에 가서 찾은뒤 가져와야 한다.
- 자 이렇게 하면, 결과적으로 인덱스를 두번 타게된다.
- 다음과 같은 쿼리는 인덱스를 한 번만 탄다.
SELECT id FROM students WHERE grade = 3;
- 여기서 위와 같은 상황에서 grade 만 가지고 인덱스를 여러번 타지 않고 한 번만에 데이터를 가져온다. 우리는 여기서
grade
에 대해커버링 인덱스
를 만족한다고 이야기 한다.
- 그러면 GROUPBY와 WHERE 절에서 동등 비교가 아닌 경우에는 어떠할까?
- Group by의 경우 인덱스의 순서와 일치하기만 하면 된다.
- WHERE 절이 동등비교가 아니면, 예를 들어
LIKE
검색으로 하는 경우에는 당연히 인덱스를 타지 않는다.
- 참고로 위 예제에서 grade 를 통해 찾는 과정은 Non-Clustered 인덱스를, id(PK)를 통해 찾는 과정은 Clustered 인덱스를 통해 찾는다.
요약
요약: Covering Index 란 쿼리를 하는데 있어 필요한 모든 데이터를 가지고 있는 인덱스를 칭한다.