index가 중요한 이유

index가 없다면 시간 복잡도는 O(N) - full scan
index가 걸려 있다면 O(logN) (B-tree based index)


index 거는 법


CREATE INDEX 또는 CREATE UNIQUE INDEX 사용.
INDEX 정보 확인 쿼리 : SHOW INDEX FROM 테이블명.

index 동작 방법 (B-tree 기반 테이블 기준)
싱글 컬럼 인덱스

ptr은 포인터의 약자.
이 테이블은 a에 대해 인덱스가 생성되어 있으며 ptr은 실제 테이블의 튜플을 가리킨다. (연결고리)

조건을 만족하는 튜플은 조건에 따라 녹색 기준점 전후에 존재할 수 있다.
멀티 컬럼 인덱스

a, b, ptr 존재.
이 경우는 왼쪽 값 a를 기준으로 오름차순 정렬.


의도에 맞지 않은 index 생성은 비효율적이거나 오히려 검색 성능(속도)을 저하시킬 수 있다.
쿼리가 어떤 인덱스를 쓰는지 확인하기


- EXPLAIN은 현재 테이블의 인덱스를 확인할 수 있다.
- 일반적으로 index는 DBMS에서 optimizer가 알아서 선택하는데, 자동 입력값이 원래 의도와 다르게 작동하고 있을 수 있다.
- 이 때는 USE_INDEX를 이용하여 DBMS에게 권장값을 전달한다.

- USE INDEX는 DBMS에게 권장 인덱스 제안.
- FORCE INDEX는 DBMS에게 강한 뉘앙스로 인덱스를 제안하는 것. (강제)
- 그러나 DBMS가 판단하기에 유저 입력 FORCE INDEX를 사용하면 데이터를 못 찾을거 같으면 FULL SCAN을 실시한다.
- 특정 인덱스를 제외하고 싶다면 IGNORE INDEX를 사용.
index는 막 만들어도 괜찮을까?

Covering index란?

Hash index에 대하여

*하단 3개는 단점임
Full scan이 더 좋은 경우

그 외

수백만건 이상 테이블에 인덱스를 생성하는 경우에는 트래픽이 적은 새벽시간 등을 추천한다.
주의 사항
