241204 TIL - MySQL 데이터베이스 인덱스

J_log·2024년 12월 4일
0

데이터베이스에서 인덱스는 테이블의 특정 컬럼에 대한 데이터를 효율적으로 검색할 수 있도록 도와주는 자료 구조이다.

MySQL에서 인덱스란?

MySQL에서 인덱스는 B-Tree나 Hash와 같은 자료 구조로 구현되어 있으며, 데이터베이스 엔진이 검색 작업을 최적화하도록 돕는다.

  • 빠른 데이터 검색 : 테이블 전체를 스캔(Full Table Scan)하지 않고 필요한 데이터를 신속하게 조회한다.
  • 정렬 작업 최적화 : ORDER BY나 GROUP BY 같은 작업을 수행할 때 정렬 비용을 줄여준다.
  • 고유성 유지 : PRIMARY KEY나 UNIQUE 제약 조건의 기반이 된다.

MySQL에서의 인덱스 종류

  • PRIMARY KEY
    • 테이블의 기본 키, 자동으로 고유 인덱스가 생성된다.
    • NULL 값을 허용하지 않는다.
  • UNIQUE INDEX
    • 중복을 허용하지 않는 인덱스
    • 한 테이블에서 여러 컬럼에 대해 설정할 수 있다.
  • INDEX(기본 인덱스)
    • 중복을 허용하며 단순히 검색 성능을 향상시키기 위한 용도로 사용된다.
  • FULLTEXT INDEX
    • 대량의 텍스트 데이터에서 키워드 검색을 위해 사용된다.
    • MySQL의 InnoDB와 MyISAM에서 지원한다.
  • COMPOSITE INDEX(복합 인덱스)
    • 여러 컬럼을 결합하여 하나의 인덱스로 구성한 것
    • 복합 인덱스에서는 인덱스 생성 시 지정된 컬럼 순서가 중요하다 !

인덱스 작동 원리

인덱스를 사용하면 데이터 검색 속도가 빨라지는 이유는 테이블의 데이터를 B-Tree와 같은 효율적인 자료 구조에 저장하기 때문이다.

SELECT * FROM employees WHERE employee_id = 123;
  • 인덱스가 없는 경우
    • 테이블의 첫 번째 행부터 마지막 행까지 모든 데이터를 확인하며 조건에 맞는 행을 찾는다.(Full Table Scan)
  • 인덱스가 있는 경우
    • 인덱스에 저장된 자료 구조를 통해 필요한 데이터를 빠르게 탐색한다.

인덱스 사용 예시

  1. 단일 컬럼 인덱스
CREATE INDEX idx_employee_name ON employees (name);
  1. 복합 인덱스
CREATE INDEX idx_employee_name_department ON employees (name, department_id);

복합 인덱스는 컬럼 순서에 따라 성능이 달라질 수 있다.
위의 인덱스는 (name, department_id) 조건으로 검색할 때 유효하지만, department_id만으로 검색할 때는 비효율적이다.

  1. 인덱스 확인
SHOW INDEX FROM employees;

인덱스의 장단점

장점
1. 검색 성능 향상 : WHERE, JOIN, ORDER BY 등의 속도가 빨라진다.
2. 고유성 보장 : PRIMARY KEY와 UNIQUE 제약 조건에서 데이터 무결성을 유지한다.

단점
1. 쓰기 성능 저하 : INSERT, UPDATE, DELETE 작업 시 인덱스를 함께 수정해야 하므로 비용이 증가한다.
2. 저장 공간 증가 : 인덱스 데이터 자체를 저장하기 위해 추가적인 공간이 필요하다.
3. 과도한 인덱스는 역효과 : 너무 많은 인덱스를 생성하면 쿼리 최적화에 오히려 부정적인 영향을 줄 수 있다.

0개의 댓글