본문 바로가기
프로그래밍

기술 면접에 자주 나오는 질문들 - 인덱스

by 자유코딩 2021. 4. 23.

이번 글부터 개발자 기술면접에 자주 나오는 질문들을 하나씩 다뤄보려고 합니다.

 

1. 데이터베이스 인덱스를 고르는 기준이 뭔가요?

카디널리티가 높은 순서로 고른다.
인덱스를 1개의 컬럼에만 걸어야 한다면 카디널리티가 가장 높은 것을 잡아야 한다. 
카디널리티란 해당 컬럼의 중복된 수치를 나타낸다. 
예를 들어서 성별, 학년은 카디널리티가 낮다.
주민등록번호, 계좌번호 이런것 들은 카디널리티가 높다. 
카디널리티란 컬럼의 중복도에 관한 내용이다.
중복도가 낮으면 카디널리티가 높다. 
중복도가 높으면 카디널리티가 낮다. 

되도록 업데이트가 빈번하지 않은 컬럼으로 인덱스를 구성한다.
where 절에서 자주 사용하는 컬럼에는 인덱스 추가를 고려한다. 
join시 자주 사용하는 컬럼은 인덱스로 등록한다. 단일 인덱스 여러개보다 다중컬럼 인덱스의 생성을 고려한다.

 

2. MySQL에서 적정 인덱스의 개수는 어떻게 정하나요?

몇개가 적당하다기 보다는 카디널리티가 높은 컬럼을 인덱스로 지정하는 것이 좋다. 
카디널리티가 높은 컬럼의 예시 - 주민등록번호, 계좌번호

너무 많이 지정하면 쓰기, 업데이트 연산이 느려진다.
적정 선에서 결정해야한다. 
보통은 3~4개 정도로 지정한다.

 

3. 데이터베이스의 B-tree index, unique index 같은 인덱스들에 대해서 설명 해보세요

DBMS마다 지원하는 인덱스의 종류가 다르다.

오라클 디비에서는 비트맵 인덱스를 지원한다.

하지만 Postgresql 에서는 비트맵 인덱스를 지원하지 않는다.

Mysql 에서는 해시 인덱스와 비트리 인덱스를 지원한다.

써봤던 데이터베이스에서 지원하는 인덱스를 위주로 알아보아야 한다.

### b tree index

루트 노트에 오름차순으로 데이터가 저장된 트리 구조의 인덱스이다.

b-tree 형태로 되어있다. 데이터를 루트 노드에서부터 비교하면서 말단 노드로 가면서 탐색한다.

삽입 삭제시 트리에 변형이 일어난다.

### bitmap 인덱스

각 값에 대한 하나의 비트맵, 각 행에 대한 하나의 엔트리

select 이외의 작업에 유지 비용이 많이 발생한다.

```
create bitmap index emp_type_idx
on emp (type)
```

아래 경우 비트맵 인덱스는 btree 인덱스보다 좋은 성능을 낸다.

- 대용량 데이터 - 수백만개의 row
- 낮은 카디널리티를 갖는 컬럼
- 질의가 where절에 있는 모든 컬럼에 대한 비트맵 인덱스를 가지는 경우
- 질의 결과가 많은 수의 행을 만족하는 각각의 where 절 조건을 가지는 경우

높은 카디널리티를 갖는 컬럼에 비트맵 인덱스를 쓰면 심각한 성능 저하를 유발할 수 있다.

### unique index

primary_constraint, unique_constraint

id, emp_id 같은 것에 걸면 unique_index

### non-unique index

job, dept_no 같은 것에 걸면 non-unique

### 결합 인덱스

부서번호, job을 자주 같이 쿼리하더라 한다면

두개 컬럼을 합쳐서 하나의 인덱스로 구성할 수 있다.

테이블의 컬럼 순서와는 무관하고 인접된 컬럼으로 구성할 필요는 없다.

where 절에 함께 사용되는 컬럼을 결합인덱스로 만들면 좋다.

컬럼 순서가 중요하다.

 

4.성별, 유무 같은 boolean 컬럼에도 인덱스를 걸면 좋은가요

b-tree인덱스는 카디널리티가 높은(중복도가 낮은) 컬럼에 걸었을때 효과적이다. 
탐색 할 수있는 값이 2개 밖에 없기 때문에 효과가 없다.

5.트리기반 인덱스와 해시 기반 인덱스가 쓰이는 곳이 어떻게 다른가요? 그리고 어디에 쓰이나요?

 

해시 기반 인덱스는 테이블의 데이터를 해시해서 찾는 방식입니다. 
equal 연산자에서 쓰입니다. ex) select * from person where hobby = 'aaaa';

댓글