오프셋 기반 페이징시 문제
- 마지막 페이지를 구하기 위해 전체 개수를 구해야 한다.
- 오프셋 이전의 데이터를 다시 읽어온다. (불필요한 데이터 조회 발생)
대안 : 커서 기반 페이징
- 페이지 번호가 아닌 키 번호를 전달받음
- 전달받은 키 이전의 데이터는 조회하지 않음.
- 마지막 키 번호를 반납함.
- 그러나 게시판 형태의 UI구현이 어렵다.
커버링 인덱스
검색 조건이 인덱스에 부합할 때 테이블에 바로 접근 하기보다 인덱스를 통해 접근하는 것이 더 빠르기 때문에 인덱스를 통해서 테이블로 흐른다.
그렇기 때문에 커버링 인덱스는 테이블까지 접근하지 않고 인덱스를 데이터를 내려준다.
예를 들어
나이 | id |
---|---|
19 | 3 |
27 | 2 |
32 | 1 |
45 | 4 |
-> 인덱스 테이블
id | 이름 | 성별 | 나이 | 직업 |
---|---|---|---|---|
1 | 이훈재 | 남 | 35 | 개발자 |
2 | 홍길동 | 남 | 35 | 도적 |
3 | 유관순 | 여 | 18 | 학생 |
4 | 이순신 | 남 | 35 | 경찰 |
-> 회원 테이블(pk=id)
나이가 30 이하인 회원 둘 조회 시
SELECT
id
FROM
회원
WHERE 나이 < 30
LIMIT 2
이렇게 쿼리문을 짜게 되면 테이블까지 조회 안 하고 바로 인덱스에서 데이터를 넘겨준다.
하지만
SELECT
id,이름
FROM
회원
WHERE 나이 < 30
LIMIT 2
이렇게 인덱스에 없는 이름을 함께 조회하게 되면 테이블까지 조회하게 됨
WITH 커버링 AS (
SELECT
id
FROM
회원
WHERE 나이 < 30
LIMIT 2
)
SELECT 이름
FROM 회원 INNER JOIN 커버링 ON 회원.id = 커버링.id
이렇게 활용하면 커버링 인덱스를 활용해서 조회하게 되면 불필요한 랜덤 데이터 액세스를 막을 수 있다.
ORDER BY, OFFSER, LIMIT 절로 인한 불필효한 데이터 블록 접근을 커버링 인덱스를 통해 최소화할 수 있다.