SQL - INDEX

CODE0227·2025년 3월 11일

SQL

목록 보기
3/6

1️⃣ index 란?

SQL에서 인덱스(Index)는 데이터베이스 테이블의 검색 성능을 향상시키기 위해 사용되는 자료 구조이다. 인덱스는 테이블의 특정 컬럼 또는 컬럼 조합에 대해 빠른 데이터 조회를 가능하게 하며, 주로 검색, 정렬, 조인 등의 작업에서 효율성을 높인다. 책의 목차나 색인처럼, 데이터베이스가 전체 테이블을 스캔하지 않고도 원하는 데이터를 빠르게 찾을 수 있도록 돕는다고 생각하면 된다.

2️⃣ 개념

인덱스는 보통 B-Tree나 Hash 같은 자료 구조로 구현된다. (대부분의 RDBMS는 B-트리를 기본으로 사용) 특정 컬럼의 값을 키로 사용해 해당 레코드의 주소를 빠르게 찾아주는 역할을 한다.
위에 설명하듯이 책에서 특정주제를 찾을 때 전체 페이지를 읽어 찾지 않고 목차를 보고 찾는 것 과 비슷하다 생각하면 된다.

3️⃣ 예시


idnameageemail
1Alice25alice@email.com
2Bob30bob@email.com
3Charlie25charlie@email.com

name 컬럼에 인덱스가 없으면

SELECT * FROM users WHERE name = 'Bob';

해당 쿼리는 테이블 전체를 스캔한다. 하지만 name에 인덱스가 있으면 인덱스를 통해 'Bob'의 위치를 바로 찾아간다.

4️⃣ 인덱스의 종류

1. 클러스터드 인덱스

  • 테이블 데이터 자체가 인덱스 키 순서대로 물리적으로 정렬
  • 테이블당 하나만 존재 가능 (보통 기본 키에 자동 생성)
  • 예시) id가 기본 키라면 테이블이 id 순으로 정렬됨.

2. 넌-클러스터드 인덱스

  • 데이터와 별도로 인덱스 구조가 생성되며, 인덱스는 키와 데이터의 위치(포인터)를 저장
  • 여러 개 생성 가능
  • 예시) name에 인덱스를 만들면 name 값과 해당 레코드 위치를 별도 저장.

3. 유니크 인덱스

  • 중복 값을 허용하지 않음.
  • 기본 키나 유니크 제약이 있는 컬럼에 자동 생성

4. 복합 인덱스

  • 두 개 이상의 컬럼을 조합해 만든 인덱스
  • 예시) CREATE INDEX idx_name_age ON users(name, age);
    WHERE name = 'Bob' AND age = 30 같은 쿼리에 유용

5️⃣ 인덱스 장점/단점

장점

  • 빠른검색 (WHERE, JOIN, ORDER BY) 등에서 성능을 향상 시킴
  • 효율적으로 데이터에 접근함 전체 테이블 스캔 대신 인덱스를 통해 필요한 데이터만 접근

단점

  • 인덱스는 별도의 공간을 차지해 저장 공간을 증가시킨다.
  • INSERT, UPDATE, DELETE 시 인덱스도 갱신을 해야 하므로 쓰기 성능이 저하 되어 속도가 느려질 수 있다.
  • 인덱스가 많아질수록 유지 관리 부담이 증가 할 수 있다.

6️⃣ 인덱스 생성/삭제 방법

-- 단일 컬럼 인덱스
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;

7️⃣ 인덱스 설계 팁

  1. 인덱스는 자주 조회되는 컬럼에 생성하는 것이 좋다. (WHERE, JOIN, ORDER BY)

  2. 카디널리티를 고려해서 설계 해야 한다. 중복이 많은 컬럼은 인덱스 효과가 낮기 때문이다.

    카디널리티는 전체 행에 대한 특정 컬럼의 중복 수치
    중복도가 ⬇ 카디널리티 ⬆
    중복도가 ⬆ 카디널리티 ⬇

  3. 쓰기 성는 저화와 저장 공간이 낭비 되기 때문에 너무 많은 인덱스 생성은 피해야 한다. (3 ~ 5)개가 적당하다.

  4. 쿼리에서 자주 필터링되는 컬럼을 먼저 배치해서 복합인덱스를 생성해야 된다.

8️⃣인덱스가 사용되지 않는 경우

  1. 컬럼에 함수나 연산이 적용된 경우: WHERE UPPER(name) = 'BOB' (인덱스 미사용).
  2. LIKE '%abc'처럼 앞부분이 와일드카드인 경우.
  3. 인덱스는 적용되지만 데이터 크기가 작은 테이블은 Full Scan이 더 빠를 수 있으므로 인덱스를 사용하지 않는게 적합하다.
profile
CODE0227

0개의 댓글