카테고리 없음
[CS지식] 인덱스(Index)란 무엇인가?
sandbackend
2023. 1. 8. 23:36
인덱스
- 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료구조
책에 비유
- 데이터는 책의 내용
- 데이터가 저장된 레코드의 주소는 인덱스 목록에 있는 페이지 번호
인덱스를 만드는 이유
- DBMS(Database Management System)도 데이터베이스 테이블의 모든 데이터를 검색해서 원하는 결과를 가져 오려면 시간이 오래 걸리기에, 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 두는 것
- 인덱스는 항상 정렬된 상태를 유지하기에 원하는 값을 탐색하기엔 빠르지만 새로운 값을 추가, 삭제하는 경우에는 실행 속도가 느려짐.
→ 결론적으로, 인덱스는 데이터의 저장 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높임
DBMS의 인덱스 관리
1. B+- Tree 인덱스 알고리즘 (Balanced)
- 일반적으로 사용되는 인덱스 알고리즘
- 트리구조의 우위성 → 탐색 시 단시간 내에 실행 가능
<B-tree, B+tree 참고 자료> https://zorba91.tistory.com/293
2. Hash 인덱스 알고리즘
- B- Tree 만큼 범용적이지 않지만 고유의 특성과 용도를 지닌 인덱스
- 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘, 매우 빠른 검색을 지원
- 비교검색에 최적화 돼 있지만 범위를 검색하거나 정렬된 결과를 가져오는 것으로 사용 불가능
저장공간
- B-Tree : 노드
- 해시 인덱스 : 버킷
탐색시간이 빠른 Hash가 인덱스로 적절하지 않은 이유
- Hash Table에 저장되는 값들은 정렬되어 있지 않기 때문에
- SQL 쿼리문에서 특정 범위의 값을 조회하는 경우
→ 특정 값보다 크거나 작은 값을 찾을 수 없다.
3. 클러스터 인덱스
- 행 데이터를 해당 열로 정렬한 후에 루트 페이지를 만듬
- 데이터 페이지는 리프 노드와 같음
- 인덱스 자체의 리프 페이지가 곧 데이터
- 데이터 입력, 수정, 삭제 시 항상 정렬 상태를 유지
- 넌 클러스터 인덱스
<참고> https://junghn.tistory.com/entry/DB-클러스터-인덱스와-넌클러스터-인덱스-개념-총정리
4. 결합 인덱스 (Composite Index)
- 인덱스를 생성 할 때 두 개 이상의 컬럼을 합쳐서 인덱스를 만드는 것
- 주로 SQL 문장에서 where절의 조건 컬럼이 2개 이상 and로 연결되어 함께 사용하는 경우 쓰임
//결합 인덱스 생성 구문 예시
CREATE INDEX idx_composite_index_1
ON Test(id, test_name, test_date)
인덱스는 잘못 사용하면 오히려 성능이 저하될 수 있다고 하였다
- 인덱스를 생성하게 되면 INSERT, DELETE, UPDATE 쿼리문을 실행할 때 별도의 과정이 추가적으로 발생하기 때문이다.
- INSERT의 경우 인덱스에 대한 데이터를 추가
- DELETE의 경우 인덱스에 존재하는 값은 삭제하지 않고 사용하지 않는다는 표시
→ 즉 row의 수가 그대로 남는다.
- UPDATE는 더 큰 문제가 발생 : 인덱스에 대한 데이터를 추가하는 것은 물론 변경 전 데이터도 사용하지 않음 으로 바꿔야 하므로 insert,delete의 문제가 모두 발생
다음과 같은 상황에서 사용하자
- 규모가 작지 않은 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 칼럼
- JOIN이나 WHERE 또는 ORDER BY가 자주 사용되는 컬럼
- 데이터의 중복도가 낮은 컬럼
면접질문
- 인덱스란 무엇인지 설명과 다양한 자료구조중 예시 몇개 해주실 수 있을까요? 인덱스는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료구조로, 하나의 컬럼이나 여러개의 컬럼을 키로 갖고 키에 해당하는 주소값을 저장하는 색인입니다. 인덱스를 구현하기 위해서는 다양한 자료구조를 사용 할 수 있는데, 가장 대표적인 해시 테이블과 B- Tree가 있습니다.
- 인덱스를 생성해야 하는 경우는 언제인가요? where, join문에서 자주 사용되는 컬럼이나, 데이터의 중복도가 적은 컬럼 그리고 테이블의 규모가 작지 않을때 인덱스를 생성해야 합니다.