[데이터베이스] RDB의 Index를 알아보자.

allen·2020년 8월 2일
0

컴퓨터공학

목록 보기
1/1
post-thumbnail

인덱스

개념

Full table sacn을 피하자.

데이터베이스 테이블의 목차를 만들어주는 역할이다. 인덱스를 만들어놓으면 CRUD시 추가적인 작업이 필요없다. 즉 고속의 검색의 목적이다.

데이터베이스의 SELECT에서 where문이나 order by문의 성능향상이 목적이다.

테이블의 1개 이상의 컬럼에 이용하여 인덱스를 등록할 수 있다.

인덱스는 카디널리티가 가장 높은 것을 기준으로 잡는게 좋다.

유저테이블에 이름, 나이, 성별이 있다면 중복이 가장 적은 이름을 추천한다.

where, order by절이 많이 등장하는 컬럼을 적용하자. ? 어떤게 진실인가.

왜냐? 해당 컬럼의 기준으로 트리를 만들게 되는데, 중복이 적은 것으로 사용하게되면 인덱스 자체가 테이블과 크게 다를게 없어진다.

출처 : https://jojoldu.tistory.com/

위는 dept_no 을 기준으로 인덱스를 만들었다. 탐색시 Leaf에 있는 정보들을 바탕으로 디스크를 읽는다. 하지만 leaf의 정보가 분기가 안되어있으면? Full table scan과 차이가 없다.

SELECT name, email FROM oauth_user WHERE oauth_domain='GITHUB'

위와 같은 oauth의 도메인별로 where절을 치는 쿼리가 있다.

인덱스가 되어있지 않으면 oauth_user 의 모든 테이블을 풀 스캔을 한다.

인덱스가 정렬해놓은 곳을 스캔하면 되기때문에 모든 테이블을 scan할 필요가 없어짐.

⇒ 디스크의 정보를 모두 읽을 필요가 없음.

예제

인덱스 등록하는법

CREATE INDEX [인덱스_이름] ON [테이블_이름] (...테이블의_컬럼)

예시)

CREATE INDEX IDX_USER ON user (address, name, gender);

이렇게하면 해당 컬럼을 사용하는 곳에서 where, join의 성능이 매우 좋아진다.

단점

'그럼 모든 테이블에 인덱스를 걸면 되는거 아니야?' 라고 생각할 수 있다. 인덱스에도 단점이 있다.

  • CUD의 속도가 느려진다. 왜냐? 인덱스도 추가적인 반영이 필요하니까

구현체의 종류

클러스터형 인덱스와 비클러스터형 인덱스가 있다.

  1. 클러스터형 인덱스는 영어사전에 많이 비유된다. → a~z부터 정렬되어있어서 바로 찾아갈 수 있음.
  2. 비클러스터형 인덱스는 책의 마지막 페이지의 단어 목차와 비슷하다. 목차 → 해당 페이지 이동한다. 그러므로 '목차' 페이지가 추가로 필요하다.
  • 클러스터형 인덱스(Clustered index)
    • 테이블당 한개만 생성 가능하다.
    • 인덱스를 지정한 열에 맞춰서 자동 정렬한다.
      • 우리가 테이블에 PK를 만들면 DB에서 클러스터형 인덱스를 PK기준으로 만들어준다.
  • 비 클러스터형 인덱스(Nonclustered index)
    • 테이블당 여러 개 생성가능하다.

면접질문 및 주요 문제

  1. 데이터베이스의 인덱스는 무엇인가요?
  2. 테이블에 설정될 수 있는 인덱스 형태들은 어떤게 있나?
  3. 인덱스가 중복많은곳에 걸까? 중복이 적은경우에 걸까? → E모사
  4. 인덱스를 여러컬럼을 건다면 카디널리티 기준으로 오름차순으로 할까? 내림차순으로 할까?

얻어간 점

Database where Vs Server filter

  • 디스크 읽는시간 < 메모리에서 읽는시간

궁금한점

  • create index하면 어떤 index가 생기나?
    • 보통 non clusered index가 생기는것 같다.
  • 여러 개의 인덱스가 있으면 어떤 인덱스를 사용할까?
    • 이중에서도 클러스터가 있고, 넌클러스터도 1개이상씩 있을 수 있는데 전략이 궁금하다.

추가로 다룰내용

  • 유니크 클러스터
  • 인덱스 자료구조 해시 vs 비트리
profile
쉽게쉽게

2개의 댓글

comment-user-thumbnail
2020년 11월 28일

SELECT name, email WHERE oauth_user WHERE oauth_domain='GITHUB'
여기 오타있습니다 ㅎㅎ

1개의 답글