인덱스의 개념
데이터를 빠르게 찾을 수 있도록 해주는 도구
1) 장점
- 검색 속도가 빨라짐
- 쿼리 부하가 줄어서, 성능이 향상됨
2) 단점
- 인덱스 추가하는 공간이 필요
- 데이터 변경 작업이 일어나는 경우 성능이 나빠질 수 있음
인덱스의 종류
1) 클러스터형 인덱스 : 테이블당 1개
2) 보조 인덱스 : 테이블당 여러개 가능
자동으로 생성되는 인덱스
Primary Key Ehsms Unique를 사용하면 자동으로 인덱스가 생성된다.
SHOW INDEX FROM table --index 확인
B-Tree(Balanced Tree, 균형 트리)
노드, 루트 노드, 리프 노드, 페이지
페이지 분할
INSERT 시 페이지 분할 발생하여, 성능이 나빠짐
클러스터형 인덱스와 보조 인덱스의 구조
1) 보조 인덱스 : 데이터 페이지를 건드리지 않고, 별도의 장소에 인덱스 페이지를 생성한다.
페이지번호 + #오프셋이 기록되어 있어, 데이터 위치를 가리키게 된다. 검색 속도가 빠르고, 데이터 입력/수정/삭제가 느리다.
2) 클러스터형 인덱스 : 데이터 페이지 전체가 다시 정렬된다. 리프 페이지가 곧 데이터이다. 검색 속도가 느리고, 데이터 입력/수정/삭제가 빠르다.
클러스터형 인덱스와 보조 인덱스가 혼합되어 있을 경우
[예시]
1) 보조 인덱스의 루트 페이지에서 '은지원' 보다 큰 값이므로 200번 페이지에 있다는 것을 확인
2) '임재범'은 클러스터형 인덱스의 키 값 LJB임을 확인한 후, 무조건 클러스터 인덱스의 루트 페이지로 가서 찾음
3) 'LJB'는 'KBS'보다 크고 'SSK'보다 작으므로 1001번 페이지에 있는 것을 확인
4) 'LJB' 값을 찾고 그 주소인 '서울'을 찾아냄

인덱스 생성
CREATE INDEX idx_usertbl_addr ON usertbl (addr);
인덱스의 성능 비교
클러스터형 인덱스와 보조 인덱스가 없을 때의 성능 차이 확인하는 실습 진행
결론
1) 인덱스는 열 단위에 생성된다.
2) WHERE 절에서 사용하는 열에 인덱스를 만들어야 한다.
3) WHERE 절에 사용되더라도 자주 사용해야 가치가 있다
4) 데이터 중복도가 높은 열은 인덱스를 만들어도 별 효과가 없다.
5) 외래 키를 지정한 열에는 자동으로 외래 키 인덱스가 생성된다.
6) JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
7) INSERT/UPDATE/DELETE가 얼마나 자주 일어나는지를 고려해야한다.
8) 클러스터형 인덱스는 테이블당 하나만 생성할 수 있다.
9) 클러스터형 인덱스가 테이블에 아예 없는 것이 좋은 경우도 있다.
10) 사용하지 않는 인덱스는 제거하자.