1.RDBMS 인덱스란?
인덱스 (Index)는 관계형 데이터베이스 관리 시스템 (RDBMS)에서 테이블에 대한 검색 속도를 높여주는 자료 구조입니다.
이를 통해 특정 테이블의 레코드를 전부 다 확인하는 것이 아니라 인덱싱된 자료 구조를 통해 검색되기 때문에 검색 속도가 빨라집니다.
인덱스에는 여러 가지 유형이 있지만, 가장 많이 사용되는 구조는 B-TREE 구조입니다.
B-TREE는 데이터베이스에서 메모리에 일정 공간을 사용하여 저장됩니다.
2.기본 용어 정리
-블록 : 디스크 I/O를 진행하는 최소 단위
-페이지 : 블록이 메모리에 올라온 것
3.인덱스를 사용하는 이유?
3-1.예시 쿼리
-> SELECT * FROM user WHERE user_name = 'minwoo'

3-2.풀스캔의 경우
-> 모든 데이터를 다 읽으므로 단순 생각했을 때 시간복잡도는 O(N)
3-3.index가 사용되는 경우
-> 보통 인덱스의 자료구조인 B-Tree 기준으로 단순 생각했을 때 시간복잡도는 O(logN)
-> 결국 index는 조건을 만족하는 row를 빠르게 찾기 위해 사용함.
4.단일 인덱스
4-1.예시 쿼리
-인덱스 생성 쿼리 : CREATE INDEX user_PK_idx ON user (PK)
-조회 쿼리 : SELECT * FROM user WHERE PK = '3'
4-2.인덱스를 통해 조회 예시

5.결합 인덱스 (멀티 컬럼 인덱스)
5-1.예시 쿼리
-인덱스 생성 쿼리 :
-조회 쿼리 :
5-2.생성된 인덱스 모습
6.커버링 인덱스
6-1.예시 쿼리
-인덱스 생성 쿼리 :
-조회 쿼리 :
6-2.내용
6.실무에선 어떻게 활용할 수 있을까?
6-1. 인덱스 생성 여부 파악
가령 "성별"과 같은 컬럼은 "남성" 또는 "여성" 데이터가 약 50%씩 저장 되리라는 것을 예상할 수 있습니다.
그렇다면, "성별" 컬럼의 경우 인덱스를 생성하더라도, 전체 레코드(row) 中 약 절반의 데이터를 조회해야 하므로 이 경우엔 인덱스를 사용하는 것 보다 풀스캔이 나으리라는 것을 예상할 수 있습니다.
이러한 판단을 통해 인덱스를 사용해야할 컬럼에만 인덱스 생성을 잘 적용할 수 있을 것으로 보입니다.
※ 참고
옵티마이저는 논클러스터 인덱스를 통해 레코드 1건을 읽는 것이 테이블을 통해 직접 읽는 것 보다 4~5배 정도 비용이 더 많이 드는 것으로 예측한다. (왜냐하면 위의 논클러스터 인덱스 개념처럼 2단계로 나눠서 작업하기 때문)
하지만 DBMS는 우리가 원하는 레코드가 어디있는지 모르므로, 모든 테이블을 뒤져서 레코드를 찾아야한다. 이는 엄청난 디스크 읽기 작업이 필요하므로 상당히 느리다.
하지만 인덱스를 사용한다면 인덱스를 통해 PK를 찾고, PK를 통해 레코드를 저장된 위치에서 바로 가져올 수 있으므로 디스크 읽기가 줄어들게 된다. 그렇기 때문에 레코드를 찾는 속도가 훨씬 빠르며, 이것이 인덱스를 사용하는 이유이다.
반면에 인덱스를 타지 않는 것이 효율적일 수도 있다. 인덱스를 통해 레코드 1건을 읽는 것이 4~5배 정도 비싸기 때문에, 읽어야 할 레코드의 건수가 전체 테이블 레코드의 5~30%를 넘어서면 인덱스를 이용하지 않는 것이 효율적이다. 이런 경우 옵티마이저는 인덱스를 이용하지 않고 테이블 전체를 읽어서 처리한다.
6-2.멀티 컬럼 인덱스 생성 시
6-3.상황에 따른 힌트 적용
7.참고
https://mangkyu.tistory.com/285
[MySQL] 프라이머리 키(PK, Primary Key)에 대해 쉽고 완벽하게 이해하기
이번 내용은 RealMySQL 8.0 책을 보면서 추가적으로 공부하여 정리한 내용입니다. 따라서 MySQL의 InnoDB가 아닌 경우에는 다를 수 있으니 참고 부탁드립니다. 1. 프라이머리 키(PK, Primary Key)와 클러스터
mangkyu.tistory.com
https://mangkyu.tistory.com/286
[MySQL] B-Tree로 인덱스(Index)에 대해 쉽고 완벽하게 이해하기
인덱스를 저장하는 방식(또는 알고리즘)에 따라 B-Tree 인덱스, Hash 인덱스, Fractal 인덱스 등으로 나눌 수 있습니다. 일반적으로 B-Tree 구조가 사용되기 때문에 B-Tree 인덱스를 통해 인덱스의 동작
mangkyu.tistory.com
https://mangkyu.tistory.com/96
[Database] 인덱스(index)란?
1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내
mangkyu.tistory.com
https://sihyung92.oopy.io/database/mysql-index
Mysql 인덱스 - 클러스티드 인덱스와 논클러스티드 인덱스 개념편
인덱스란
sihyung92.oopy.io
https://www.youtube.com/watch?v=IMDH4iAQ6zM
https://www.youtube.com/watch?v=liPSnc6Wzfk
'개발자 이야기 > 기타' 카테고리의 다른 글
| Redis 개요 및 데이터 타입 (0) | 2024.05.08 |
|---|---|
| Tree 자료구조 종류 (0) | 2024.05.08 |