인덱스?
읽기 성능을 향상시키기 위해 사용하고 쓰기 성능 희생 (PK, 보조키)
읽어야하는 레코드 수에 따른 효율적인 방법
- 인덱스를 통해 읽는 것이 테이블에서 직접 레코드를 읽는 것 보다 4-5 배 정도 많은 비용
- 전체 레코드에서 20-25% 이하의 양을 읽는 다면 인덱스를 사용하는 것이 효율적
B-Tree 인덱스를 통한 데이터 읽기
인덱스 레인지 스캔
- Index seek: 인덱스에서 조건을 만족하는 값이 저장된 위치를 찾음
- Index scan: 1에서 탐색한 위치부터 필요한 만큼 인덱스를 차례로 읽음
- 2번에서 읽은 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽음
인덱스 풀 스캔
인덱스에 포함된 컬럼만 처리하는 경우
루스 인덱스 스캔
- min, max 함수에 대해 최적화 하는경우 사용됨
- where 조건에 만족하는 모든 범위를 스캔하지 않고 다음레코드로 넘어감
인덱스 스킵 스캔
-
MySQL 8.0 부터 옴티마이저가 where 조건절에 index 조합중에 한개 만 있어도 인덱스 검색을 가능하게 해준다
ALTER TABLE employees ADD INDEX ix_gender_birthdate (gender, birth_date) // 인덱스를 사용 못하는 쿼리 mysql> SELECT * FROM employees WHERE birth_date>='1965-02-01' // 인덱스를 사용할 수 있는 쿼리 mysql> SELECT * FROM employees WHERE gender='M' AND birth_date>='1965-02-01'
유니크 인덱스
- Mysql 에서는 인덱스 없이 유니크 제약만 설정할 수 없음
- 테이블이나 인덱스에 같은 값이 2 개 이상 저장될 수 없응
인덱스 읽기
- CPU 에서 칼럼값을 비교하는 작업이 있어 유니크하지않은 인덱스와 성능상 차이가 없다
- 유니크하지않은 인덱스가 검색에서 느린것은 읽어야할 레코드 수가 많은것
인덱스 쓰기
- 유니크 인덱스는 키 값을 쓸 때 중복된 값이 있는지 체크하는 과정이 더 필요함
Reference
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791158392703