본문 바로가기

프로그래밍 강의 메모/갖고노는 MySQL 데이터베이스 by 얄코

MySQL 더 깊이 알아가기 > 인덱스 - 검색을 빠르게!

https://inf.run/JvXX

 

갖고노는 MySQL 데이터베이스 by 얄코 - 인프런 | 강의

비전공자도 이해할 수 있는 MySQL! 빠른 설명으로 필수개념만 훑은 뒤 사이트의 예제들과 함께 MySQL을 ‘갖고 놀면서’ 손으로 익힐 수 있도록 만든 강좌입니다., - 강의 소개 | 인프런...

www.inflearn.com

 

인덱스

  • 특정 컬럼(들)에 대한 목차 생성 - 검색 가속화
  • 테이블 내용변경(추가, 수정, 삭제)시 시간 더 소모
    • 내용변경이 자주있는 테이블은 인덱스를 추가하지 않는 것이 좋다.

 

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 컬럼에만 적용 가능

3. Hash 인덱스

  • 일치 여부만 확인 (= 가능, >, >=, <, <=, LIKE 등 불가)
  • 인덱스 크기가 작고 검색이 매우 빠름
  • MEMORY, NDB 엔진에서만 사용가능
    • InnoDB 엔진에서는 내부적으로 Adoptive Hash Index 구현
      • 자주 사용되는 데이터만 내부적으로 해시값 생성하여 속도 증가

4. 비트맵 인덱스

  • Cardinality가 낮은 컬럼에 적합
  • MySQL에는 없음