Database/MySQL

[MySQL]MySQL에서의 INDEX

GAEBAL 2022. 3. 19. 00:46
728x90

INDEX

  • 레코드 검색 기준: 책 목차 개념
  • PK 컬럼에는 자동으로 인덱스 객체 생성
  • 검색 속도 빠름
  • CUD: 레코드 추가, 변경, 삭제 속도 저하
  • where 조건절에 많이 사용하는 컬럼에 인덱스 추가

 

인덱스 선정 기준

  1. 분포도가 좋은 컬럼
  2. 자주 조합되어 사용되는 컬럼들
  3. 수정이 빈번하지 않은 컬럼
  4. Foreign Key로 사용되는 컬럼
  5. MIN 또는 MAX 값을 자주 구하는 컬럼
  6. 정렬 기준으로 자주 사용되는 컬럼

 

예제

예제와 함께 SQL 쿼리들을 쭉 실행해보는 느낌으로다가 ㄱㄱ

-- 테이블 생성된 인덱스 조회
show index from employees;

 

-- 테이블 생성된 인덱스 조회
show index from departments;

 

-- 인덱스 타는지 확인: 안탐 -> type은 all(full scan), possible_keys(인덱스 탈 수 있는 키들)는 아무것도 안나옴, key(인덱스 탄 키들)
explain
select * from employees;

 

-- 1. 인덱스 타는지 확인: 인덱스 사용됨 -> type은 const나 range?(여기서는 const), possible_keys는 뭐시기뭐시기가 나옴, key(인덱스 탄 키들)
explain
select * from employees where employee_id=100;

 

-- 2. 인덱스 타는지 확인: 인덱스 사용됨 -> type은 index_merge, possible_keys는 뭐시기뭐시기가 나옴, key(인덱스 탄 키들)
explain
select * from employees where employee_id=100 or last_name='Cambrault';

 

-- 3. 인덱스 타는지 확인: 인덱스 사용됨 -> type은 all 나옴(full scan), possible_keys는 뭐시기뭐시기가 나옴, key(인덱스 탄 키들)
explain
select * from employees where employee_id=100 or last_name='Cambrault' or first_name='Gerald';

 

-- 4. 인덱스 타는지 확인: 인덱스 사용됨 -> type은 index_merge, possible_keys는 뭐시기뭐시기가 나옴, key(인덱스 탄 키들)
explain
select * from employees where employee_id=100 or (last_name='Cambrault' and first_name='Gerald');

 

-- 5.
explain
select * from employees where job_id='SA_REP' AND salary between 5000 and 10000;

 

 

정리

  • 이런 식으로 explain을 쓰면 인덱스와 그 외의 정보들을 알 수 있음!!
  • 무조건 인덱스를 탄다고 좋은게 아님!!! 검색에만 좋은거임!
728x90