인덱스는 데이터가 있는 위치이다.
MySQL InnoDB에서는 인덱스가 없는 테이블 탐색시 Full scan이 발생하게 된다.
하지만 인덱스 생성시 B-Tree를 통해 데이터를 탐색하기 때문에 data page read 횟수가 줄어들게 된다.
인덱스에는 두 가지 종류가 있다.
- Clustered Index
- Non Clustered Index
Clustered Index
- 테이블당 1개만 존재
- Primary Key 제약 조건으로 생성하면 자동으로 생성
- 인덱스에 데이터 페이지가 함께 존재
- B-Tree의 Leaf page == data page
- 데이터가 항상 정렬된 상태여야 한다.
- INSERT, UPDATE, DELETE 문 등이 발생하면 페이지 재분할을 통해 기존 정렬을 재정렬해야한다.
Non-Clustered Index
- Secondary Index라고도 부른다.
- 테이블당 여러개가 존재할 수 있다.
- Unique 제약 조건으로 생성하면 자동으로 생성
- 인덱스와 데이터페이지가 따로 존재
- 리프 페이지에서 데이터가 있는 곳의 주소를 가짐
- 데이터 페이지에 데이터가 정렬되지 않아도 됨
- Clusterd Index보다 속도가 약간 느리지만 INSERT, UPDATE, DELETE시 부하가 적다.
Cardinality
어떤 컬럼에 인덱스를 생성해야 하는가?
-> 중복 수치가 낮은 것
인덱스 사용시 주의 사항
- 사용하지 않는 인덱스는 삭제하여 페이지가 재정렬되는 오버헤드를 줄여야 한다.
- 외래키를 지정한 열에는 자동으로 외래 키 인덱스가 생성
- Where 절에서 자주 사용되는 컬럼만이 인덱스의 가치가 있다.