[MySQL] 인덱스 사용

금지수·2022년 6월 29일
0

MySQL

목록 보기
1/1

업무를 하며 정리한 내용을 기록하기 위함으로 부족한 부분이 있을 수 도 있습니다.

1. 인덱스란?

쿼리의 select의 속도 향상을 도와주기 위한 자료구조이다. 쿼리가 느리다! insert, update, delete 처리가 느린 것이지 select는 인덱스를 활용하여 insert, update, delete 할 대상을 빠르게 찾아준다. 책의 책갈피와 동일한 역할을 한다고 볼 수 있다.

2. 인덱스 방법 및 결과

인덱스 방법

  • 조회
SHOW INDEX FROM 테이블이름
  • 추가
-- 단일 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1)

-- 다중 컬럼 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1, 필드이름2, ...)
  • 삭제
ALTER TABLE 테이블이름 DROP INDEX 인덱스이름;

주의!!!) INDEX를 빠트리지 마세요. 저처럼 큰일납니다.

PK는 자동으로 주어지는 ID를 사용하고 있다보니, 주어진 ID를 사용하지 않고 select를 해야 하는 경우가 있었다. 상품코드는 Unique 했지만 n개의 창고에 동일하게 있다보니 상품코드 + 창고로 검색하는 식들이 많았었는데 속도가 현저히 느려 인덱스를 추가하고 확인해보았다.

인덱스 없을때 vs 추가

0.0063초 vs 0.0015 약 4.2배 차이
스캔의 방법에도 변화가 있었다. 없을시에는 전체를 찾는 Full scan 이였다면,
추가 후에는 id 값으로 select 하는 것과 동일하게 Index unique scan이 되었다.

현재 select 하는 스캔의 종류를 확인 해보고 싶다면, 현재 쿼리문 앞에 Explain을 붙이면 된다. type을 통해 확인가능하다.

인덱스 사용시 주의점

  • 조회시 자주 사용하는 컬럼
  • 카디널리티가 높을 수록 좋다 (= 중복이 거의 없을 수록 좋다.)
  • 너무 많은 인덱스는 좋지 않다.(= 책에 책갈피가 엄청 많으면 더 찾기 힘들다.)
  • 크기가 큰 테이블에서는 효과적이다.
  • order by, group by에서도 인덱스가 걸리지만 몇 예외사항은 안된다.
profile
언젠간 하겠지

0개의 댓글