본문 바로가기

Database/mariaDB administrator

mysql 커버링 인덱스란 무엇인가? | sTricky

mysql 커버링 인덱스란 무엇인가? | sTricky

mysql 커버링 인덱스란 무엇인가? sTricky

일전에 SQL 튜닝 의뢰가 들어왔습니다.
요청 받은 SQL을 보니 특정 테이블을 self조인하는 형태 였습니다. 물론 SQL을 작성하면서 self조인은 필수불가결 할 때가 있죠. self조인 자체가 문제가 있는것은 아닙니다. 하지만 중요한것은 self 조인 역시 필요할 때만 써야 한다는것 이란거죠. 그래서 요청하신 분께 다시 문의를 드리니 커버링 인덱스를 쓰기 위한 self조인이라고 말 했습니다.

커버링 인덱스, 그건 무엇일까요?
그것에 대해서 알아보도록 하겠습니다.

커버링 인덱스란

커버링 인덱스라는건 어떤 SQL에서 원하는 출력 데이터와 조건 데이터가 모두 인덱스에 존재 하는 경우를 이야기 합니다. B-Tree 스캔으로만 모든 데이터를 알 수 있기때문에 인덱스에 있는 주소값을 참조하여 데이터 블록으로 가지 않고 출력까지 가능 한 경우를 이야기 합니다.

커버링 인덱스를 사용하면 쿼리의 성능이 아주 좋아지는 장점이 있습니다.

커버링 인덱스 실습

아래와 같이 테이블을 만들고, 데이터를 넣고, 인덱스를 생성 해보도록 하겠습니다.
SQL은 아래와 같습니다.

create table address_svc_m.cover_index
(
    id        int(11) auto_increment,
    sido_name varchar(100),
    sgg_name  varchar(100),
    sido_code varchar(100),
    sgg_code  varchar(100),
    primary key (id)
);


create index cover_index_id_sido_name_sgg_name_index
    on address_svc_m.cover_index (id, sido_name, sgg_name);

아래와 같이 테이블과 인덱스가 생성 된 것을 확인 할 수 있습니다.

커버링 인덱스 실습1

 

 

 

그리고 아래와 같이 select SQL을 실행 합니다.

select id, sido_name, sgg_name
from address_svc_m.cover_index
where sgg_name = '창원시 진해구'

결과가 아주 잘 나왔네요.

커버링 인덱스 실습2

그럼 이 SQL의 실행 계획을 살펴보도록 하겠습니다.

커버링 인덱스 실습3

실행 계획을 살펴보시면 cover index 라는게 보이실 겁니다.
위에서 테이블을 생성하고 인덱스를 생성 할 때 id, sido_name, sgg_name 컬럼으로 인덱스를 만들었는데, 위 SQL에서 해당 컬럼들로만 조건을 주고 출력을 하기 때문에 이렇게 커버링 인덱스가 동작을 하게 되는 겁니다.

이렇게 오늘 커버링 인덱스에 대해서 알아 보았습니다.
감사합니다.

by.sTricky

  • Favicon of https://codingdog.tistory.com 코딩강아지 2021.01.28 14:51 신고

    self는 알고 있었는데 커버링 인덱스는 모르고 있었네요.
    b tree에서 순회가 가능하다면 생각 보다 빠를 듯 하네요 ㅎㅎ.

    아 그냥 (인덱스를 저장하기 위한) 비트리에만 있었군요.

    그러면 실제 데이터가 있는 위치에 드갈 필요가 없으니
    엄청 빨라지겠네요.

    커버링 인덱스를 쓰기 위한 self.
    알아갑니다.