728x90
커버링 인덱스
검색 조건이 인덱스에 부합하다면, 테이블에 바로 접근 하는 것 보다 인덱스를 통해 접근하는 것이 매우 빠르다.(절대적이진 않다.)
그렇다면 테이블에 접근하지 않고 인덱스로만 데이터 응답을 내려줄 순 없을까? -> 커버링 인덱스
(인덱스로만 커버 하겠다)
예
Index Table
나이 | id |
---|---|
19 | 3 |
27 | 2 |
32 | 1 |
45 | 4 |
회원 Table
id | 이름 | 성별 | 나이 | 직업 |
---|---|---|---|---|
1 | 홍길동 | 남 | 32 | 경찰 |
2 | 김천사 | 여 | 27 | 목사 |
3 | 이순신 | 남 | 19 | 어부 |
4 | 김철수 | 남 | 45 | 개발자 |
1. 아래 쿼리를 실행하게 된다면..?
SELECT 나이
FROM 회원
WHERE 나이 < 30
- Index Table에서 나이가 19, 27을 찾게 된다.
- 이후 회원 Table 에서 나머지 정보를 찾게 된다.
하지만 원하는 정보는 '나이' 뿐이므로 굳이 회원 Table까지 갈 필요가 없다.
2. 그렇다면 아래 쿼리를 실행하게 된다면..?
SELECT 나이, id
FROM 회원
WHERE 나이 < 30
id도 1. 번 쿼리 처럼 클러스터 인덱스로 존재 하기 때문에 커버링 인덱스 와 같이 실행이된다.
따라서
Mysql에서는 PK가 클러스터 인덱스이기 때문에 커버링 인덱스에 유리 하다
그렇다면 커버링 인덱스로 페이지네이션 최적화를 어떻게 할 수 있을까?
예) 나이가 30이하인 회원의 이름을 2개만 조회 한다면..?
// ORDER BY, OFFSET, GROUP BY, LIMIT 절로 인한 불필요한 데이터블록 접근을 커버링 인덱스를 통해 최소화
WITH 커버링 AS (
SELECT id
FROM 회원
WHERE 나이 < 30
LIMIT 2
)
SELECT 이름
FROM 회원
INNER JOIN 커버링
ON 회원.id = 커버링.id
따라서 커버링 인덱스란?
불필요한 데이터 엑세스 접근을 커버링 인덱스로 범위를 줄여 놓고 찾는 데이터만 데이터 엑세스를 하도록 하는 기법
728x90
'BackEnd' 카테고리의 다른 글
헥사고날 아키텍처(Hexagonal Architecture)_ 추가 수정 필요 (0) | 2024.08.27 |
---|---|
멀티 스레드 환경에 대한 이해 (0) | 2024.02.05 |
Timline 읽어오는법 ( pull/push Model ) (0) | 2024.02.03 |
페이지 네이션 방식(오프셋, 커서) 장단점 (0) | 2024.01.25 |
Rest API 란? (0) | 2023.04.15 |