인덱스
- 특정 컬럼(들)에 대한 목차 생성 - 검색 가속화
- 테이블 내용변경(추가, 수정, 삭제)시 시간 더 소모
1. 인덱스 사용하기
-- 인덱스 생성
ALTER TABLE `mydatabase`.`businesses`
ADD INDEX index_biz_name (business_name);
-- 다중 컬럼 인덱스
ALTER TABLE menus
ADD INDEX index_name_cal (menu_name, kilocalories);
-- 인덱스 조회
SHOW INDEX FROM businesses;
-- 인덱스 삭제
ALTER TABLE businesses
DROP INDEX index_biz_name;
2. 인덱스를 사용하기 적합한 곳
- 데이터의 변경이 잦지 않은 테이블
- WHERE, ORDER BY 에 자주 사용되는 컬럼
- JOIN에 사용되는 컬럼
-
⭐ Cardinality가 높은 컬럼 = 중복도가 낮은 컬럼 (B-Tree 경우)
- 성별: 부적합, 이름: 적합
3. 인덱스의 종류
1. B-Tree 인덱스
- 기본(default) 인덱스
- Cardinality가 높은 컬럼에 적합
2. Full-Text 인덱스
ALTER TABLE ratings
ADD FULLTEXT INDEX index_full_text (comment);
SELECT * FROM ratings
WHERE MATCH(comment) AGAINST ('괜찮은데');
- 다수의 단어 등을 포함하는 컬럼에서 단어 및 구문을 검색하기 위함
- 데이터를 일정 단위로 분할하여 인덱싱
- *InnoDB, MyISM에서만 사용 가능
- CHAR, VARCHAR, TEXT 컬럼에만 적용 가능
- Full-Text Index 문서 링크
3. Hash 인덱스
- 일치 여부만 확인 (= 가능, >, >=, <, <=, LIKE 등 불가)
- 인덱스 크기가 작고 검색이 매우 빠름
-
MEMORY, NDB 엔진에서만 사용가능
-
InnoDB 엔진에서는 내부적으로 Adoptive Hash Index 구현
- 자주 사용되는 데이터만 내부적으로 해시값 생성하여 속도 증가
- Adoptive Hash Index 문서 링크
-
4. 비트맵 인덱스
- Cardinality가 낮은 컬럼에 적합
- MySQL에는 없음