안녕하세요 이번 글은 제가 QueryDSL로 커버링 인덱스를 사용하여 성능을 개선하며 겪은 이야기입니다.

먼저, 페이징 성능 개선에 종류가 아래와 같습니다.

이번 시간에는 count 쿼리 최적화를 제외하고 NoOffset과 커버링 인덱스 중에 고민했습니다. 왜냐하면 count 쿼리는 데이터를 가져오는 게 아니기 때문에 일단 제외했습니다

저의 서비스는 페이지를 꼭 보여줘야 합니다. 그래서 NoOffset 방식보단 커버링 인덱스를 사용하기로 했습니다.

커버링 인덱스란?

select, where, order by, limit, group by 등에서 사용되는 모든 컬럼이 Index컬럼안에 포함된 경우입니다.

저만의 정리는, 커버링 인덱스를 통해 대상을 추려옵니다. 그리고 추려진 대상으로 데이터를 가져오는 것입니다.

커버링 인덱스는 왜 빠를까?

인덱스를 이용해 조회되는 쿼리는 성능 저하를 부르는 부분은 인덱스를 검색하고 대상이 되는 row의 나머지 컬럼값을 데이터 블록에서 읽을 때입니다.

예시를 보여드리겠습니다.

select * from User where id = 1;

위의 쿼리는 *로 모든 컬럼값을 가져오는 과정이 들어갑니다. 그래서 이 부분이 row의 나머지 컬럼값을 데이터 블록에서 읽을 때입니다. 만약 *이 아니라 id를 가져온다면 id는 PK이기 때문에 커버링 인덱스를 이용하게 되는 것입니다.

select id from User where name = "이름1"

이렇게 된다고 해도 pk 아닌 컬럼을 사용하기떄문에 데이터 블록에 접근해야 합니다