'인덱스'는 테이블의 특정 컬럼에 대해 빠르게 데이터를 검색 가능하도록 도와주는 자료구조.
책의 목차처럼 원하는 데이터를 빠르게 찾아가는 역할을 수행.
'인덱스'는 데이터베이스 테이블에서 "검색 기능을 높이기 위해 사용하는 자료구조"
주로 B-Tree 또는 Hash 구조로 구현되며, 특정 컬럼에 대해 생성.
책의 목차처럼, 원하는 데이터를 직접 찾지 않고 "참조 포인터"를 통해 빠르게 접근할 수 있게 도와줌.
인덱스를 사용하지 않으면
DB는 전체 데이터를 "Full Table Scan" 해야 하므로, 검색 시간이 오래 걸림.
'인덱스'가 없다면, DB는 테이블의 모든 행을 처음부터 끝까지 비교하는 "Full Table Scan"을 수행.
특히 데이터가 많을수록 성능이 저하됩니다.
SELECT * FROM users WHERE name = 'kim';
-> name 컬럼에 인덱스가 없다면, 모든 레코드를 직접 비교.
'인덱스'를 사용하면 전체 테이블을 조회할 필요 없이, 필요한 데이터에 바로 접근 가능하기에,
디스크 I/O를 줄이고 검색 속도를 크게 향상시킬 수 있음.
"인덱스"는 '검색 기능'을 향상시키는 '핵심 도구'
단, 인덱스가 무조건 빠른 것은 아님.
B-Tree 인덱스는 균형 이진 트리 형태로, 데이터를 정렬된 형태로 관리.
탐색,삽입,삭제가 효율적이고 대부분의 RDBMS에서 기본 인덱스로 사용.
B-Tree 인덱스는 대부분의 RDBMS에서 기본적으로 사용하는 인덱스 구조.
정확히는 Balanced Tree(Balanced Search Tree) 구조로, 탐색 & 삽입 & 삭제 모두
O(log n)시간 복잡도를 가짐.
구조 특징.
ex)
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-> B-Tree 인덱스를 통해 효율적으로 범위 탐색이 가능.
Hash 인덱스는 해시 함수를 이용해서 '키 값'을 '해시 버킷'으로 매핑.
'동등 비교'에는 매우 빠르지만, '정렬'이나 '범위 검색'에는 적합하지 않음.
Hash 인덱스는 '해시 함수'를 기반으로 인덱스를 구성하여,
특정 값의 정확한 검색(Equal Lookup)에 매우 뛰어난 성능을 보임.
특징.
ex)
SELECT * FROM cache WHERE session_id = 'abc123';
-> 해시 인덱스가 효과적.
B-Tree는 범위 조회와 정렬이 가능한 반면, Hash 인덱스는 동등 비교만 빠름.
B-Tree는 대부분의 상황에 유용하고, Hash는 = 조건에 최적화된 인덱스.
항목 | B-Tree 인덱스 | Hash 인덱스 |
---|---|---|
검색 방식 | 노드 순회 (정렬 기반) | 해시 함수 기반 |
범위 조회 | 가능 (BETWEEN , > , < ) | 불가능 |
정렬 지원 | 가능 (ORDER BY ) | 불가능 |
LIKE 연산 | 접두사 검색 가능 | 불가능 |
성능 | 대부분의 상황에서 안정적 | 동등 비교 = 조건에서 매우 빠름 |
활용 환경 | 범용 인덱스 | 메모리 기반 캐시, In-Memory DB 등 |
대표 사용처 | RDBMS 기본 인덱스 | MySQL MEMORY 엔진 등 |
B-Tree는 범용적, Hash는 특화된 상황에서 사용하는 것이 적절. !
'클러스터드 인덱스'는 '인덱스 순서'가 실제 데이터의 저장 순서와 동일한 인덱스.
하나의 테이블에 하나만 만들 수 있고, 기본 키에 주로 사용.
-ex)
SELECT * FROM users ORDER BY created_at;
-> " created_at " 이 클러스터드 인덱스면 디스크 접근 최소화 가능.
'넌클러스터드 인덱스' 는 인덱스에 데이터의 참조 주소만 저장되는 형태.
한 테이블에 여러 개 만들 수 있으며, '리프 노드'에는 실제 데이터가 없음.
"넌클러스터드 인덱스"는 "리프 노드에 실제 데이터가 아닌,
해당 레코드의 위치(ROW ID 등)"만 포함하는 인덱스.
특징.
ex)
SELECT name FROM users WHERE email = 'a@b.com';
-> email에 Non-Clustered 인덱스가 있으면 ROW ID로 접근 후 name 조회
'프라이머리 키'는 자동으로 유니크 제약과 '클러스터드 인덱스'를 함께 생성.
즉, 프라이머리 키는 '고유성'을 보장할 뿐만 아니라, '성능 향상'도 도모함.
'Primary Key는 논리적 제약조건'이며, 대부분의 RDbMS는 이를 선언할 때
아래의 것들을 자동으로 생성.
즉, Primary Key는 내부적으로 '인덱스로 구현'되며,
해당 키 값으로 데이터를 빠르게 조회 가능.
ex)
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-> id 컬럼에 클러스터드 인덱스가 자동 생성. !
'유니크 인덱스'는 중복 값을 허용하지 않는 인덱스로, 데이터 무결성을 보장합니다.
이메일,주민번호 등 고유해야 하는 필드에 사용.
'유니크 인덱스(Unique Index)'는 인덱스를 생성할 때,
해당 컬럼의 값이 중복되지 않도록 제약을 거는 인덱스.
특징.
ex)
CREATE UNIQUE INDEX idx_email ON users(email);