INDEX

·2025년 1월 25일

필수영상

목록 보기
17/40

[10분 테코톡] 👨‍🏫안돌의 INDEX

INDEX

검색을 위해 임의의 규칙대로 부여된 임의의 대상을 가리키는 무언가.

데이터베이스에서 검색 속도를 향상시키기 위해 사용되는 데이터 구조. 책의 색인처럼 특정 열(column)의 값을 기반으로 데이터를 빠르게 찾을 수 있도록 돕는다.

예를 들어 2학년 3반 21번을 하면 누군가를 특정할 수 있고, 주민번호도 마찬가지다.
이처럼 인덱스는 어려운 개념이 아니라 어떤 무언가를 찾기 위한 키의 개념으로 생각할 수 있다.

INDEX의 필요성

  • 빠른 검색: 인덱스를 사용하면 WHERE 조건으로 데이터를 조회할 때 전체 테이블을 검색하는 것(Full Table Scan)을 피할 수 있다.
  • 성능 향상: 대량의 데이터가 있는 테이블에서 쿼리 성능을 크게 향상시킨다.
  • 정렬 속도 개선: ORDER BY, GROUP BY와 같은 연산이 포함된 쿼리의 실행 속도를 향상시킨다.
  • 조인(Join) 최적화: 인덱스가 설정된 컬럼을 기준으로 조인하면 성능이 향상된다.

데이터베이스는 내가 원하는 데이터를 어떻게 찾아오는 걸까?
왜 데이터가 많아질수록 점점 느려질까?
왜 조인만 수행하면 느리지? 왜 쿼리가 느릴까?
이 의문들에 대해서 인덱스만 잘 안다면 이 문제의 많은 부분들을 해결할 수 있게 될 것이다.

INDEX의 종류

인덱스의 종류는 두가지가 있는데 아주 복잡한 내용이라 간략한 설명만 정리를 해보자.

클러스터드 인덱스 (Clustered Index)

데이터와 인덱스가 군집화된(한곳에 모아놓은) 인덱스를 클러스터드 인덱스라고 부른다.
클러스터드 인덱스는 순서대로 정렬되어 있기 때문에 범위 검색에는 강력하지만 인서트 할 때는 어려움이 있을 수 있다.

📌 특징

  • 데이터의 물리적 저장 순서와 일치하는 인덱스
  • 하나의 테이블당 한 개만 존재
  • PRIMARY KEY를 지정하면 자동으로 생성됨
  • 데이터 자체가 정렬된 상태로 저장되므로 범위 검색(BETWEEN, <, >)에 유리
  • 삽입/삭제 시 데이터 정렬을 유지해야 하므로 성능이 저하될 수 있음

예시

CREATE TABLE users (
    id INT PRIMARY KEY,  -- 기본 키가 자동으로 클러스터드 인덱스가 됨
    name VARCHAR(50),
    age INT
);

id가 클러스터드 인덱스가 되어 데이터가 id 기준으로 정렬된 상태로 저장된다.

클러스터드 인덱스는 내가 알고 있는 PK와 아주 유사하다.
반드시 PK인 것은 아니지만 PK와 거의 같다고 생각해도 무방!
범위 검색이 많을 때나 데이터가 자주 변경되지 않는 경우에 유리하다.

넌 클러스터드 인덱스 (Non-Clustered Index)

데이터와 연결되어 있는 것이 아니라 어떤 인덱스와 간접참조 되어 연결되어 있는것.
약한 참조로 되어있어서 굳이 순서대로 정렬하지 않아도 되고, hash 방식으로만 해서 굉장히 빠르게 데이터를 찾을 수 있다.

📌 특징

  • 데이터의 물리적 저장 순서와 관계없이 별도의 인덱스 구조로 관리
  • 한 개의 테이블에 여러 개 생성 가능
  • 실제 데이터와는 별도로 인덱스 페이지에 저장됨
  • 검색 시 넌 클러스터드 인덱스를 먼저 탐색하고, 실제 데이터가 저장된 위치를 조회하는 방식
  • 단순 검색(WHERE, JOIN)에서 빠른 성능을 제공하지만, 데이터 수정(INSERT, UPDATE, DELETE) 시 성능 저하 발생 가능

예시

CREATE INDEX idx_user_name ON users(name);

name 컬럼에 대해 넌 클러스터드 인덱스를 생성
name을 검색할 때 인덱스를 활용해 빠르게 조회 가능

특정 컬럼의 검색을 빠르게 해야 할 때나 JOIN, ORDER BY, GROUP BY를 자주 사용할 때, 자주 변경되는 데이터가 많은 경우 (INSERT, UPDATE, DELETE)에 유리하다.

0개의 댓글