커버링 인덱스란?
- 테이블에 접근하지 않고 인덱스 데이터만 반환(응답)!
- mysql에서는 PK가 clustered Index이기 때문에 이 조건에 매우 유리!
- 모든 인덱스 테이블에 id(pk)가 존재하기에 커버링 인덱스에 매우 유리!
인덱스가 있을 경우 순서
예시
SELECT 나이, id FROM 회원 WHERE 나이 < 30
일반적인 경우
순서 -> 나이 index를 조회 -> 나이가 30 이하인 id 조회 -> id값 반환
-> 반환된 id값으로 member Table 조회 -> 반환
커버링 인덱스의 경우
순서 -> 나이 index를 조회 -> 나이가 30 이하인 id 조회 -> id값 반환
페이지네이션 예시
나이가 30 이하인 회원의 이름을 2개만 조회 // 나이가 30 이하인 회원이 50,000명이 넘는다.
※ index = age
- 일반적인 인덱스 사용 -> 50,000번의 데이터 블럭 access가 일어남 -> Random I/O가 50,000건 발생
- 커버링 인덱스 사용 -> (age<30) => 커버링 인덱스 동작 -> 테이블에서 50,000개의 데이터중 2개만 가져옴 -> 데이터 블럭 access가 2건 발생 -> Random I/O가 2건 발생
with covering as ( SELECT id FROM member WHERE age < 30 LIMIT 2 ) SELECT 이름 FROM 회원 INNER JOIN covering on member.id = covering.id
이미지 출처 : 패스트캠퍼스