[참고] MySQL INDEX

하하호호훈이·2025년 5월 18일

SQL(MySQL) MUST KNOW

목록 보기
10/23
post-thumbnail

이번 포스팅에서는 데이터베이스 성능 최적화의 핵심인 INDEX(인덱스) 에 대해 배워봅니다.

빠른 검색과 조회 성능 향상에 꼭 필요한 개념이지만, 무분별한 사용은 오히려 성능을 떨어뜨릴 수 있어요 💡


1. 인덱스란?

INDEX는 테이블에서 데이터를 더 빠르게 찾기 위한 자료 구조입니다.
책의 목차, 사전의 가나다 순 배열처럼 '찾기 쉽게 정리된 표' 라고 생각하시면 됩니다.

  • 데이터를 빠르게 조회할 수 있습니다.
  • 하지만 인덱스를 너무 많이 만들면 쓰기 성능이 저하되고, 저장 공간도 증가합니다.
  • 인덱스는 키 필드만 저장하고, 나머지 데이터는 저장하지 않기 때문에 공간 효율성은 높지만, 남용은 금물!

2. 인덱스의 종류

2.1 클러스터형 인덱스 (Clustered Index)

  • 실제 데이터가 인덱스 순서대로 정렬되어 저장
  • PRIMARY KEY로 자동 생성됨
  • 테이블당 하나만 존재할 수 있음

2.2 보조 인덱스 (Secondary / Non-clustered Index)

  • 데이터 위치만 따로 정리한 인덱스 (찾아보기 형태)
  • UNIQUE나 일반적인 인덱스는 모두 보조 인덱스

3. 인덱스 실습 예제

3.1 테이블 생성

CREATE TABLE employees (
  emp_id INT NOT NULL PRIMARY KEY,
  emp_name VARCHAR(50) NOT NULL,
  department VARCHAR(50),
  email VARCHAR(100) UNIQUE,
  salary INT,
  hire_date DATE
);

3.2 인덱스 조회

SHOW INDEX FROM employees;

3.3 예시 결과

TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollationCardinalityIndex_type
employees0PRIMARY1emp_idA8BTREE
employees0email1emailA8BTREE

✅ PRIMARY → 클러스터형 인덱스
✅ UNIQUE 인덱스 (email) → 보조 인덱스

3.4 주요 컬럼 설명

  • Table: 인덱스가 적용된 테이블 이름
  • Non_unique: 0이면 중복 불가, 1이면 중복 허용
  • Key_name: 인덱스 이름. PRIMARY이면 클러스터형 인덱스
  • Seq_in_index: 인덱스 내 컬럼 순서 (1부터 시작)
  • Column_name: 인덱스가 적용된 컬럼 이름
  • Collation: 정렬 방식 (A: 오름차순, NULL: 정렬 없음)
  • Cardinality: 고유 값 개수의 예측치 (클수록 성능 기대)
  • Index_type: 인덱스 방식 (BTREE, HASH, FULLTEXT 등)

4. 인덱스 생성과 삭제

4.1 인덱스 생성

-- 방법 1: CREATE INDEX
CREATE INDEX idx_department ON employees(department);

-- 방법 2: ALTER TABLE
ALTER TABLE employees ADD INDEX idx_salary(salary);

4.2 인덱스 삭제

ALTER TABLE employees DROP INDEX idx_department;
ALTER TABLE employees DROP INDEX idx_salary;

📌 UNIQUE 제약조건을 주면 자동으로 보조 인덱스로 생성됩니다.


5. 테이블 생성 시 인덱스 정의

CREATE TABLE employees (
  emp_id INT NOT NULL PRIMARY KEY,
  emp_name VARCHAR(50) NOT NULL,
  department VARCHAR(50),
  email VARCHAR(100) NOT NULL UNIQUE,
  salary INT,
  hire_date DATE,
  UNIQUE INDEX idx_emp_email (email),
  INDEX idx_emp_dept (department)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

✅ 마무리 요약

개념설명
INDEX데이터 검색 속도 향상을 위한 색인 구조
Clustered Index데이터가 실제 정렬되어 저장됨 (PRIMARY KEY에 자동 생성)
Secondary Index별도 색인만 따로 유지, 여러 개 가능
CREATE INDEX인덱스 생성 (또는 ALTER TABLE 방식으로도 가능)
DROP INDEX기존 인덱스 삭제
  • 인덱스는 SELECT 성능을 극적으로 향상시킬 수 있지만, INSERT/UPDATE 성능은 저하시킬 수 있습니다.

  • 읽기/쓰기 비율조회 패턴, 데이터 분포를 고려해 전략적으로 사용해야 합니다.

그럼 다음 포스팅에서 만나요! 👋

profile
AI, Data Science/Analysis 리뷰용가리지용 😆

0개의 댓글