Mysql 인덱스

인덱스란?

홍찬기
3 min readMay 17, 2021

책에서 목차, 색인을 사용하면 찾고싶은 정보를 빠르게 찾을 수 있다. 인덱스란 테이블의 컬럼들을 기준으로 목차를 생성하는것이다. 인덱스는 특정 알고리즘을 사용해 해당 데이터들을 따로 저장하여 빠르게 데이터를 찾을 수 있다.

대신 인덱스를 사용하면 생성, 수정, 삭제 성능이 저하된다. 수정 또는 삭제를 하기전에 해당 데이터들을 찾을때 인덱스가 사용되면 빠르게 찾을 수 있다.

B-Tree

B-Tree는 최상위의노드를 Root, 중간의 노드를 Branch, 최하위 노드를 Leaf 라고 부른다. Leaf노드는 실제 데이터 레코드를 찾아가기 위한 주소 값을 가지고 있다.

B-Tree의 인덱스 탐색 순서는 Root -> Branch -> Leaf로 되어있다. Root노드에서 가장 첫번째의 인덱스 컬럼에 해당하는 값을 찾고 두번째 컬럼은 첫번째 컬럼에서 해당된 데이터열을 보고 찾는다. 이렇게 가지치기를 하고 마지막 Leaf노드에서 실제 데이터의 레코드 주소 값을 찾아서 데이터를 찾는다.

인덱스 기준

인덱스를 적용할때 기준이 있다. 인덱스를 적용시킬때 기준이 되는것은 카디널리티(Cardinality) 값이다.카디널리티 값이 높은것을 기준으로 인덱스를 적용시켜야 한다. 카디널리티란 컬럼의 분산도이다. 특정 컬럼이 많은 값을 가지고 있으면 카디널리티가 높다. 중복된값이 적고 많은 값을 가지고있으면 인덱스를 사용해 많은 값들을 걸러 낼 수 있다.

여러개의 컬럼을 인덱스로 설정할때는 카디널리티가 높은갚 에서 낮은값으로 설정을 해야 한다. 인덱스로 값을 찾을때 먼저 설정된 인덱스 컬럼부터 차례대로 찾는다. 이때 먼저 설정된 인덱스 컬럼이 카디널리티가 높으면 먼저 많은 값들을 걸러낼 수 있기 때문이다.

카디널리티가 낮은값 부터 설정을 한다면 처음에 많은 값들을 걸러 내지 못해 효율성이 낮다.

인덱스 Type 컬럼

  • all: 테이블 풀스캔
  • index: ALL과 동일하지만 인덱스 트리만을 스캔
  • range: 주어진 범위에 들어 있는 행만을 추출, 행 선택은 인덱스를 사용
  • eq_ref: PRIMARY KEY 혹은 UNIQUE NOT NULL 인덱스를 이용하며 조인을 수행하는 경우
  • ref: eq_ref와 다른 점은 PRIMARY KEY 혹은 UNIQUE 인덱스가 아니라면 사용
  • const: PRIMARY KEY 또는 UNIQUE 인덱스의 모든 부분을 상수 값과 비교할 때 사용
  • system: 테이블에 단 하나의 행만 존재

References

https://zorba91.tistory.com/293

--

--

No responses yet