logo

[MySQL] 인덱스

 

인덱스

인덱스(Index)는 MySQL 등의 데이터베이스 관리 시스템에서 데이터 검색 속도를 향상시키기 위해 사용하는 데이터 구조입니다. 인덱스를 이용하면 데이터베이스 엔진은 테이블 전체를 검색(풀 테이블 스캔)하지 않고, 빠르게 데이터를 찾을 수 있습니다.

 

인덱스가 필요한 이유

  • 데이터 검색 속도 향상: 큰 데이터 집합에서 특정 레코드를 빠르게 찾아낼 수 있습니다.
  • 정렬된 데이터 접근 향상: 인덱스는 정렬된 순서로 데이터를 저장하여 정렬된 데이터에 빠르게 접근할 수 있게 해줍니다.
  • 집계 연산 최적화: GROUP BY나 DISTINCT 같은 집계 연산의 성능을 개선할 수 있습니다.
 

기본 인덱스 타입과 속성

  • B-TREE 인덱스: 가장 일반적인 인덱스 타입으로, 범위 검색과 정확한 값을 찾는 검색에 유용합니다.
  • HASH 인덱스: 메모리 기반의 테이블에서 주로 사용되며, 정확한 값에 대한 빠른 접근을 제공합니다. 순차적인 데이터 접근에는 적합하지 않습니다.
  • FULLTEXT 인덱스: 텍스트 기반의 검색, 예를 들어 검색 엔진에서 사용되는 인덱스 타입입니다.
  • SPATIAL 인덱스: 공간 데이터 처리를 위해 사용되며, 주로 GIS(지리 정보 시스템) 데이터에 사용됩니다.
 

인덱스 생성하기

 

CREATE INDEX 명령어 소개

CREATE INDEX 명령어를 사용하여 테이블의 특정 컬럼에 인덱스를 생성할 수 있습니다. 기본 형식은 다음과 같습니다:

CREATE INDEX 인덱스_이름 ON 테이블_이름 (컬럼_이름);
 

단일 컬럼 인덱스 생성

단일 컬럼에 인덱스를 생성하는 예는 다음과 같습니다:

CREATE INDEX idx_name ON users (name);
 

복합 컬럼 인덱스 생성

복수의 컬럼에 대해 인덱스를 생성하는 방법입니다. 예를 들어, nameemail 컬럼에 대한 인덱스는 다음과 같이 생성합니다:

CREATE INDEX idx_name_email ON users (name, email);
 

UNIQUE 인덱스와 PRIMARY KEY 인덱스

  • UNIQUE 인덱스: 컬럼의 모든 값이 유일해야 함을 보장합니다. 중복된 값을 입력하려고 하면 오류가 발생합니다.
CREATE UNIQUE INDEX idx_email ON users (email);
  • PRIMARY KEY 인덱스: 각 행의 고유한 식별자 역할을 합니다. 자동으로 UNIQUE 인덱스를 가지며, 테이블 당 하나만 설정할 수 있습니다.
ALTER TABLE users ADD PRIMARY KEY (id);
 

인덱스 관리와 최적화

 

인덱스 활용 전략

  • 적절한 컬럼 선택: 자주 조회되고, WHERE 절 등에서 사용되는 컬럼에 인덱스를 생성합니다.
  • 복합 인덱스 활용: 여러 컬럼을 함께 자주 조회하는 경우, 복합 인덱스를 고려합니다.
 

인덱스의 영향 분석 및 모니터링

  • EXPLAIN 명령어 사용: SQL 쿼리의 실행 계획을 분석하고, 인덱스 사용 여부를 확인할 수 있습니다.
  • 성능 모니터링: 인덱스 생성 후, 실제 쿼리 성능이 개선되었는지 모니터링합니다.
 

인덱스 조정과 삭제

  • 인덱스 삭제: 더 이상 사용하지 않는 인덱스는 삭제하여 관리 오버헤드를 줄일 수 있습니다.
DROP INDEX idx_name ON users;
  • 인덱스 조정: 쿼리 패턴 변경에 따라 인덱스를 추가하거나 조정합니다.
 

인덱스 사용 시 주의사항

 

인덱스 오버헤드

인덱스는 검색 속도를 향상시키지만, 추가적인 저장 공간을 사용하며, 데이터 삽입, 수정, 삭제 작업 시 성능 저하를 일으킬 수 있습니다.

 

쿼리 성능 저하 원인 분석

인덱스가 올바르게 사용되지 않는 경우, 예상과 다르게 쿼리 성능이 저하될 수 있습니다. 따라서, 쿼리 실행 계획을 분석하여 인덱스의 효율성을 평가해야 합니다.

 

인덱스 선택의 중요성

올바른 컬럼에 인덱스를 생성하는 것이 중요합니다. 모든 컬럼에 인덱스를 생성하는 것은 바람직하지 않으며, 사용 패턴을 분석하여 적절한 인덱스를 선택해야 합니다.

Previous
트랜잭션