본문 바로가기

개발/MySQL

[SQL] 인덱스란?

인덱스는 데이터베이스 쿼리의 성능을 생각하면 빼놓을수 없는 부분이다.

쿼리의 개발이나 튜닝을 설명하기 전에, mysql에서 사용가능한 인덱스의 종류 및 특성을 간단히 살펴보자.

 

인덱스라는 것을 설명하기 전에, 통상적으로 데이터베이스를 책에 비유하는 경우가 많은데,

책의 마지막 페이지에 있는 색인으로 설명하곤 한다.

 

즉, DBMS (Mysql, 오라클, MariaDB등)도 테이블의 모든 데이터를 검색해서 원하는 결과를 얻으려면 

시간이 오래 걸린다.

그래서 컬럼들의 값과 해당 레코드가 저장된 주소를 key값: value값을 한 쌍으로 인덱스를 만들어 둔다.

 

프로그래밍 언어별로 각 자료구조의 이름이 조금씩 다르긴 하지만, 

SortedList와 ArrayList라는 자료구조는 익숙할 정도로 많이 들어봤을텐데, 단어로만 봐도 

SortedList는 저장되는 컬럼의 값을 이용해 항상 정렬된 상태로 유지한다.

ArrayList는 데이터 파일과 같은 자료구조로, 저장된 순서대로 별도의 정렬없이 그대로 저장해둔다.

 

RealMySQL 책을 참고하면, 인덱스는 우리가 흔히 알고있는 key와 혼용해서 같은 의미로 사용한다.

보통 우리 회사와 같은 작은 회사의 데이터 베이스는 인덱스를 많이 쓰지 않는다. 기능적으로 문제가 없다면

인덱스 없이도 기본키만으로 데이터 무결성을 유지하지 않는 그런 데이터베이스를 가지게 된다.

 

그러나 인덱스를 정확한 역할별로 구분하고 데이터를 관리하는 방식중복값의 허용 여부에 따라서 구분하고 사용한다면

데이터의 저장 성능을 희생하고 읽기 속도를 높이는 방식으로 설계를 하는데 도움이 될것이다.

 

인덱스를 역할별로 구분하자면, 프라이머리 key와 보조 key로 구분해 볼수 있다.

Primary key = 기본키

보조키 = 기타 인덱스들

 

  • 기본키: 레코드를 대표하는 컬럼의 값을 의미한다. 식별자라고 부른다. 널값을 허용하지 않으며, 중복을 허용하지 않는다.
  • 보조키: 유니크 인덱스( 대체 키 ), 나머지 모든 인덱스

데이터를 관리하는 방식( 알고리즘 )으로 구분하자면, B-Tree인덱스와 Hash인덱스로 구분할수 있다.

값을 변형하지 않는 B-Tree인덱스와 값을 변형하여 매우 빠른 검색을 지원하는 해쉬인덱스 정도만 숙지를 하고 있자.

 

중복값의 허용 여부에 따라 구분한다면 

UNIQUE / NON-Unique등이 있다. 실제 쿼리를 실행하는 옵티마이저 입장에서 중복값을 허용하는지는 상당히 성능에 

영향을 미치는 문제가 된다.