728x90
▶ B-TREE 인덱스란?
▷ 개념
B-TREE(균형 트리)는 검색, 삽입, 삭제 연산이 로그(log n)시간에 수행되도록 설계된 트리 구조.
MySQL에서 가장 일반적으로 사용되는 인덱스 구조이다.
▷ 특징
- 정렬된 데이터를 빠르게 검색할 수 있음
- 범위 검색(=, >, <, BETWEEN, LIKE ‘abc%’) 최적화 가능
- BUT, 앞에 와일드카드가 있는 경우(LIKE ‘%abc’) 사용 불가
- 보통 PRIMARY KEY나 UNIQUE KEY에 자동으로 생성됨
- 비교 연산을 활용한 쿼리 성능이 향상됨
▷ 언제 사용하면 좋을까?
- 숫자 데이터나 범위 검색을 자주 해야 하는 경우
- WHERE 절에 특정 컬럼을 자주 사용하는 경우
▶ FULLTEXT 인덱스란?
▷ 개념
FULLTEXT 인덱스는 긴 텍스트 데이터에서 특정 단어(키워드)를 검색하는 데 최적화된 인덱스.
MySQL의 InnoDB, MyISAM에서 지원하는 전문 검색(FTS) 기능이다.
▷ 특징
- LIKE 연산보다 훨씬 빠른 검색이 가능하다.
- 자연어 검색, Boolean 검색 같은 기능 제공
- MATCH() AGAINST() 함수를 사용해야 함.
- 짧은 단어는 검색되지 않음(보통 3~4글자 이상)
▷ 언제 사용하면 좋을까?
- 블로그, 뉴스, 논문 검색처럼 긴 텍스트 데이터를 검색할 때
- 단순 LIKE ‘%word%’ 검색보다 빠르게 특정 키워드를 찾고 싶을 때
▷ 예제
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT INDEX idx_articles_content (content) -- FULLTEXT 인덱스 생성
);
SELECT * FROM articles
WHERE MATCH(content) AGAINST('database optimization');
이 쿼리는 "database"와 "optimization" 단어를 포함하는 문서를 빠르게 찾아준다.
▶ FULLTEXT 인덱스 없이 검색하면?
SELECT * FROM articles WHERE content LIKE '%database%';
FULLTEXT 인덱스가 없으면 LIKE 연산자를 이용해서 텍스트 검색을 해야함.
위 쿼리는 다음과 같은 문제가 있다.
- 인덱스를 전혀 사용하지 못함 → FULL TABLE SCAN을 해야함 → 성능 망
- 데이터 양이 많을수록 검색 시간이 급격히 느려짐
- 중요한 키워드가 문서 중 어디에 있든 다 비교해야 함
→ 즉, 테이블에 데이터가 많을수록 속도가 기하급수적으로 느려짐
▶ FULLTEXT 인덱스가 있으면?
SELECT * FROM articles
WHERE MATCH(content) AGAINST('database');
- MATCH() AGAINST() 사용 시 단어 단위로 검색해서 최적화됨
- 불필요한 데이터 검색을 줄이고, 빠르게 결과를 반환
MySQL에서 긴 텍스트 검색할 때는 무조건 FULLTEXT 인덱스가 최고다!
없으면.. Elasticsearch 같은 전문 검색 엔진을 써야함..
728x90
'BackEnd > 쿼리 튜닝' 카테고리의 다른 글
[쿼리 튜닝] 2-2. 쿼리 인덱스 튜닝 / 단일 인덱스, 복합인덱스 (0) | 2025.02.19 |
---|---|
[쿼리 튜닝] 2-1. 인덱스란? / 클러스터드 인덱스 (Clustered Index), 논 클러스터드 인덱스 (Non Clustered Index) (0) | 2025.02.18 |
[쿼리 튜닝] 1. EXPLAIN을 활용한 실행 계획 분석 (0) | 2025.02.16 |