SQL에서 인덱스(Index)는 데이터베이스 테이블의 검색 성능을 향상시키기 위해 사용되는 자료 구조이다. 인덱스는 테이블의 특정 컬럼 또는 컬럼 조합에 대해 빠른 데이터 조회를 가능하게 하며, 주로 검색, 정렬, 조인 등의 작업에서 효율성을 높인다. 책의 목차나 색인처럼, 데이터베이스가 전체 테이블을 스캔하지 않고도 원하는 데이터를 빠르게 찾을 수 있도록 돕는다고 생각하면 된다.
인덱스는 보통 B-Tree나 Hash 같은 자료 구조로 구현된다. (대부분의 RDBMS는 B-트리를 기본으로 사용) 특정 컬럼의 값을 키로 사용해 해당 레코드의 주소를 빠르게 찾아주는 역할을 한다.
위에 설명하듯이 책에서 특정주제를 찾을 때 전체 페이지를 읽어 찾지 않고 목차를 보고 찾는 것 과 비슷하다 생각하면 된다.
| id | name | age | |
|---|---|---|---|
| 1 | Alice | 25 | alice@email.com |
| 2 | Bob | 30 | bob@email.com |
| 3 | Charlie | 25 | charlie@email.com |
name 컬럼에 인덱스가 없으면
SELECT * FROM users WHERE name = 'Bob';
해당 쿼리는 테이블 전체를 스캔한다. 하지만 name에 인덱스가 있으면 인덱스를 통해 'Bob'의 위치를 바로 찾아간다.
-- 단일 컬럼 인덱스
CREATE INDEX idx_name ON users(name);
-- 복합 인덱스
CREATE INDEX idx_name_age ON users(name, age);
-- 유니크 인덱스
CREATE UNIQUE INDEX idx_email ON users(email);
-- 삭제
DROP INDEX idx_name ON users;
인덱스는 자주 조회되는 컬럼에 생성하는 것이 좋다. (WHERE, JOIN, ORDER BY)
카디널리티를 고려해서 설계 해야 한다. 중복이 많은 컬럼은 인덱스 효과가 낮기 때문이다.
카디널리티는 전체 행에 대한 특정 컬럼의 중복 수치
중복도가 ⬇ 카디널리티 ⬆
중복도가 ⬆ 카디널리티 ⬇
쓰기 성는 저화와 저장 공간이 낭비 되기 때문에 너무 많은 인덱스 생성은 피해야 한다. (3 ~ 5)개가 적당하다.
쿼리에서 자주 필터링되는 컬럼을 먼저 배치해서 복합인덱스를 생성해야 된다.