인덱스 -> B-tree
인덱스 생성
즉, 또 하나의 매핑 테이블
이 생성되는 것이다!
매핑 테이블 구조는 pointer 주소값을 가지고 있는 것처럼 해당 테이블 블럭의 주소
를 가지는 구조이며,
search시, 그 테이블로 매핑된 곳을 가서 나머지 데이터들을 꺼내오는 방식이다.
인덱스 탐색은
Root -> Branch -> Leaf -> 디스크 저장소
순으로 진행된다.
페이지 단위
로 관리됨.컬럼을 기준으로 소팅(정렬)
되어 저장돼어 search가 더 빨라지는 것이다.
즉 테이블 풀 스캔 x => 인덱스 스캔
여기서 특정 데이터 검색시 시작점 지정하게 되고(ex. where조건절) 인덱스 스캔이 되는 것이다!
자주 등장하는 컬럼
을, 그리고 분별력이 있는 컬럼
을 먼저 배치하면 더 효율적으로 search가 된다.
where
order by
내에서.
그러기 위해 필드에 index를 설정할 시,
고려할 요소로 3가지 기준
들이 있다.
1) 카디널리티 (Cardinality)
중복이 없는 정도
를 나타내는 값인데, 높을수록 한 컬럼이 갖고있는 데이터에 중복이 없다는 뜻이다.
ex. 주민등록번호, 계좌번호 > 성별, 학년
=> 1개의 컬럼만 인덱스를 걸어야 한다면, 해당 컬럼은 카디널리(Cardinality)
가 가장 높은 것을 잡아야
한다.
2) 선택도 (Selectivity)
특정값을 얼마나 잘 골라낼 수 있는지에 대한 지표로,
선택도 = (카디널리티 / 총 레코드수) * 100
전체 레코드와 조건절에 의해 선택될 예상 레코드 수의 비율이다. 5~10% 비율이 적당하다고 한다.
3) 활용도
카디널리티나 선택도가 별로 좋지 않더라도, 데이터가 빈번하게 호출되고 인덱스를 써서 조금이라도 개선됨이 보이면 쓰는거다.
여러컬럼을 조합을 하는
복합 인덱스
같은 경우,
빨라지긴 하는데 마구잡이 인덱스 설정하면 lock 남발 => 데드락 발생할 가능성 있어 주의해서 써야 한다.
select 외 insert, update, delete(특히, insert) 어디에 저장할 지 찾아야 되서 더 비효율인 작업이 되어진다!
인덱스 손익 분기점은 전체 데이터의 10~15%
부터다. 이 때부터는 search도 느려지게 된다!
인덱스로 설정한 컬럼만 읽어 쿼리를 모두 처리할 수 있는 인덱스.
불필요한 디스크 I/O 를 줄여 조회 시간을 단축할 수 있다.
select * from product ;
->
select id, name, price from product;
< Real Mysql 8.0 > 1권