본문 바로가기

DB

[DB] MySQL - 인덱스 살펴보기

728x90

인덱스란?

인덱스(index)는 데이터베이스 테이블에서 원하는 데이터를 빠르게 찾기 위한 데이터 구조다.

책의 맨 앞에 있는 목차를 보면 어디어 어떤 내용이 나오는지 나오듯이, 인덱스 역시 전체 데이터를 다 뒤지지않고 바르게 접근할 수 있게 도와준다.

인덱스의 종류

인덱스 종류 설명 특징 예시
기본 키 인덱스(Primary Key Index) 기본 키를 설정하면 자동으로 생성됨 중복 ❌, NULL ❌ 테이블에서 무조건 하나만 존재 CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(50));
고유 키 인덱스(Unique Index) 중복이 없는 값을 위한 인덱스 중복 ❌, NULL ✅ (단, 여러 개 가능) CREATE UNIQUE INDEX idx_email ON users (email);
일반 인덱스(Secondary Index) 중복이 가능한 컬럼에 사용 중복 ✅, NULL ✅ WHERE 절 자주 사용 시 유리 CREATE INDEX idx_name ON emp(name);
복합 인덱스(Composite Index) 여러 열을 묶어서 인덱스를 생성 열 순서 중요 카디널리티 높은 열 먼저 CREATE INDEX idx_multi ON orders (user_id, order_date);
전문 검색 인덱스(Full-text Index) 긴 텍스트(설명, 본문 등)를 빠르게 검색 LIKE '%단어%' 보다 빠름 CREATE FULLTEXT INDEX idx_desc ON products(description);

인덱스는 왜 여러 종류일까?

다양한 검색 조건에 대응하기 위해서는 여러 종류의 인덱스가 필요하기 때문이다.

  • WHERE user_id = 1 → 정확한 값 검색
  • WHERE email = 'abc@example.com' → 고유 값 검색
  • WHERE name LIKE 'A%' → 패턴 검색
  • WHERE salary > 3000 → 범위 검색
  • WHERE MATCH(content) AGAINST ('MySQL') → 자연어 텍스트 검색

위와 같이 검색 조건의 방식이 달라진다면 인덱스를 만드는 방법도 달라져야 한다.

인덱스 종류 최적화 대상 용도 예시
기본 키 인덱스 기본키 검색 user_id = 1
고유 인덱스 중복 방지 + 빠른 조회 email = 'a@a.com'
일반 인덱스 자주 검색되는 필드 name = 'Tom', status = 'active'
복합 인덱스 다중 조건 WHERE name = 'Tom' AND age = 30
전문 검색 인덱스 자연어 검색 게시글 내용에 '마케팅' 포함 여부

이처럼 검색 조건의 방식이 달라지면 필요로하는 인덱스의 종류도 다양해지기 때문에 인덱스가 다양한 종류를 가진다.

인덱스 사용시 주의사항

인덱스를 많이 만들수록 쓰기(INSERT, UPDATE, DELTE) 성능은 느려진다.

인덱스를 잘못 선택한다면 사용하지 않을때보다 성능이 하락한다.

  • 낮은 카디널리티의 컬럼에 인덱스를 만드는 경우
  • 성별이나 Y / N 같은 경우가 이에 해당함

인덱스가 있더라도 항상 사용되는것은 아니다.

  • 옵티마이저가 판단했을때, 인덱스를 사용한다면 더 느리다고 판단되면 무시한다.
728x90