반응형
MySQL에서 인덱스(Index)는 단순히 하나의 구조만 있는 게 아니다. 목적에 따라 다양한 인덱스 타입이 존재하며, 각 인덱스마다 용도와 성능 특성이 다르다.
🌳 BTREE 인덱스 – 가장 기본이자 널리 쓰이는 인덱스
BTREE 인덱스는 MySQL의 기본 인덱스 방식이며, 대부분의 경우 자동으로 적용된다.
특징
- 범위 검색에 강하다 (BETWEEN, <, >, LIKE 'abc%' 등)
- ORDER BY, GROUP BY, JOIN 등에 자주 활용됨
- InnoDB, MyISAM 모두 지원
예제
CREATE INDEX idx_name ON users(name);
SELECT * FROM users WHERE name LIKE 'Kim%';
주의
- LIKE '%abc'처럼 앞에 와일드카드가 있을 경우 인덱스가 무시됨
반응형
⚡ HASH 인덱스 – 동등 조건(=)에 특화된 인덱스
HASH 인덱스는 메모리 기반의 MEMORY 엔진에서 사용되며, 빠른 검색에 특화되어 있다.
특징
- = 비교 연산에 매우 빠르다
- 범위 검색은 지원하지 않음
- MEMORY 스토리지 엔진에서만 사용 가능
예제
CREATE TABLE temp_users (
id INT,
name VARCHAR(100),
INDEX USING HASH (name)
) ENGINE=MEMORY;
적합한 상황
- 캐시 테이블, 세션 테이블 등 정확한 키 검색이 잦은 구조
📝 FULLTEXT 인덱스 – 텍스트 검색을 위한 전문 인덱스
FULLTEXT 인덱스는 자연어 기반 텍스트 검색에 특화된 인덱스이다. InnoDB, MyISAM 엔진에서 모두 지원한다.
특징
- 긴 텍스트에서 키워드 기반 검색 가능
- MATCH() ... AGAINST() 구문 사용
- VARCHAR, TEXT 컬럼에만 적용 가능
예제
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT,
FULLTEXT (content)
);
SELECT *
FROM articles
WHERE MATCH(content) AGAINST('database optimization');
주의
- 기본 설정에서는 3자 이하 단어는 검색되지 않으며, 불용어(stopword)는 무시된다
반응형
🗺️ SPATIAL 인덱스 – 공간(지리) 데이터 검색
SPATIAL 인덱스는 위치, 좌표 등 공간 데이터(GIS)를 처리하기 위한 인덱스다. MyISAM, InnoDB에서 지원되며, GEOMETRY 타입과 함께 사용한다.
특징
- 2차원 공간 검색 최적화
- 공간 관계(교차, 포함 등)를 빠르게 판단
- ST_Contains(), MBRWithin() 같은 함수와 함께 사용
예제
CREATE TABLE places (
id INT PRIMARY KEY,
location POINT NOT NULL,
SPATIAL INDEX(location)
);
활용 분야
- 지도 기반 검색 서비스
- 근처 상점 찾기, 배달 반경 필터링 등
📊 인덱스 타입 요약 비교
인덱스 종류 | 지원 엔진 | 특징 | 범위 검색 | 전문 검색 |
BTREE | InnoDB, MyISAM | 범용, 기본 인덱스 | ✅ 가능 | ❌ 불가 |
HASH | MEMORY | 정확한 일치 빠름 | ❌ 불가 | ❌ 불가 |
FULLTEXT | InnoDB, MyISAM | 자연어 검색 | ❌ 불가 | ✅ 가능 |
SPATIAL | InnoDB, MyISAM | 위치 기반 검색 | ✅ 가능 | ❌ 불가 |
반응형
⚠️ 인덱스 선택 시 주의사항
- 인덱스를 잘못 사용하면 성능 저하 발생
- 잘못된 WHERE 조건, 함수 사용, 컬럼 순서 변경 등이 인덱스를 무력화할 수 있음
- EXPLAIN으로 항상 쿼리 성능 확인 필수
📌 마무리 요약
- BTREE 인덱스: 범용적이고 대부분의 조건에 적합
- HASH 인덱스: = 검색에 최적화, 범위 검색은 불가
- FULLTEXT 인덱스: 자연어 텍스트 분석에 특화
- SPATIAL 인덱스: 지도, 위치 기반 서비스에서 활용
인덱스를 제대로 이해하고 선택하면 데이터베이스 성능이 극적으로 향상될 수 있다. 상황에 따라 올바른 인덱스를 선택하자.
🔗 참고한 공식 문서
MySQL Index Types:
https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html
반응형
'DB' 카테고리의 다른 글
[MySQL] EXPLAIN이란? 실행계획을 확인하는 이유와 기본 구조 정리 🔍 (1) | 2025.07.04 |
---|---|
[MySQL] 실무에서 인덱스가 무시되는 이유와 해결법 완전 분석 (0) | 2025.07.03 |
[MySQL] EXPLAIN으로 인덱스 성능 튜닝하는 법 (실행계획 완전 분석) (0) | 2025.07.03 |
[MySQL] 인덱스 설계 가이드: 실무에서 실패하지 않는 인덱스 전략 🛠️ (0) | 2025.07.03 |
[MySQL] 인덱스란? 개념과 필요한 이유 완벽 정리 🧠 (0) | 2025.07.03 |
[MySQL] DML과 LOCK 동작 원리 및 충돌 해결 가이드 🔒 (0) | 2025.07.03 |
[MySQL] DML과 트랜잭션 오토커밋 제어 완벽 정리 ⚙️ (0) | 2025.07.03 |
[MySQL] DML과 FOREIGN KEY 제약조건 관리 완전 정복 🔗 (1) | 2025.07.03 |