[DB-MySQL 인덱스(INDEX) #2] 인덱스의 종류, 인덱싱 알고리즘의 종류 MySQL

꿀주말이 끝나간다... ㅠㅠㅠ 이번주말은 너무 피곤했기에 포스팅도 못썼는데..
그래두 하나는 써야지 싶어서 일단 인덱스에 대한 포스팅을 마무리 하기로 ㅎㅎㅎ

어쨋든!!!
지난 포스팅에서는 DB 서버를 꾸리기 위한 저장 매체의 종류와 특성 등을 알아보았다.
그리고 이번 포스팅에서는 드디어!! MySQL의 인덱스에 대한 본격적인 내용을 다루고자 한다.

먼저, 우리가 보는 일반 서적의 제일 끝부분에 '찾아보기' 혹은 '색인'이라는 부분이 있다.
이 부분은, 주로 책의 특정 용어나 주제를 간략히 적어두고 해당 페이지 번호를 적어둔 것을 말한다.
우리는 그래서 그것을 보며 그 책의 특정 내용에 페이지 번호를 찾고 바로 해당 내용을 읽을 수 있다.

MySQL의 인덱스(INDEX)도 이와 비슷하다. 그 정의를 먼저 살펴보자

인덱스(INDEX) : DB 테이블의 컬럼값과 해당 레코드가 저장된 주소를 키-값 쌍(Key-Value pair)으로 인덱스를 만들어서 주어진 순서로 미리 정렬하여 파일을 만들어 두는 것이다. 

그럼 이에따른 인덱스의 특성은 무엇일까? 

읽기는 빠르게, 하지만 쓰기는 느리게 : 인덱스의 내부 요소는 항상 정렬되어 있어야 한다.
그래서 데이터를 읽어오는(SELECT) 데에는 유리하지만 저장하는(INSERT, DELETE, UPDATE) 데에는 불리하다.

요약하면, 인덱스는 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하고,

그 대신 데이터의 읽기속도(SELECT)를 높이는 기능이다.

======================================================

< 인덱스의 역할별 종류 >

- 프라이머리 키(Primary key, 식별자) : 해당 레코드를 대표하는 컬럼 값으로 만들어진 인덱스를 의미, 테이블에서 해당 레코드를 식별할 수 있는 기준값이 된다. (NULL 및 중복 허용 X)

- 보조 키(Secondary key) : 프라이머리 키를 제외한 나머지 인덱스, UNIQUE KEY는 Primary key와 성격이 비슷하여 대체키라고도 하는데, 보조키로 분류하기도 한다.

데이터 중복 허용 여부에 따라서는 유니크(Unique) 인덱스유니크하지 않은(Non-unique) 인덱스로 구분할 수 있다.
이는 단순히 같은값이 해당 컬럼에 유일하게 존재하는지 여부를 의미하지만 DBMS 쿼리를 실행해야하는 옵티마이저에게는 상당히 중요한 정보가 된다.

========================================================================

< 인덱싱 알고리즘의 종류 >

- B-tree 알고리즘 : 가장 일반적으로 사용, 오래전부터 도입되어 많이 안정화 된 알고리즘. 컬럼 값을 변환하지 않고 원래 값을 이용해 인덱싱.

- Hash 인덱스 알고리즘 : 컬럼 값으로 Hash 값을 계산하여 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원. 변환된 값을 이용하여 인덱싱 하므로 LIKE 검색과 같은 부분일치 값을 검색하고자 할때는 사용 불가. 주로 메모리 기반의 DB에서 많이 사용.

- Fractal-Tree 알고리즘 : B-tree 알고리즘의 단점을 보완을 위해 등장, 원래 값을 이용해 인덱싱. 데이터의 저장과 삭제 시 처리비용을 감축, 조만간 B-tree 알고리즘을 대체할 수 있을거라 예상.

========================================================================

< 동작방식에 따른 인덱스의 종류 >

너무 세부적인 내용이 아닌 개괄적이고, 굵직굵직한 것만을 적어보도록 하겠다.

- B-tree 인덱스: DB 인덱싱 방법중 가장 일반적이고 먼저 도입되었음. B-tree 알고리즘 사용

- Hash 인덱스 : Hash 인덱스 알고리즘 사용. 동등비교 검색에 최적화 되어있다. 메모리 기반 테이블에 주로 사용되며 대용량 디스크 기반 테이블에는 사용되지 않음.

- R-tree 인덱스 : 2차원의 데이터를 인덱싱하고 검색하는 목적의 인덱스, Spatial Index라고도 불린다.

- Fractal-Tree 인덱스가장 최근에 개발된 대용량 데이터 처리에 적합한 알고리즘. 독점 특허 등록으로 DBMS에 구현되지 못하고 있다. 랜덤 I/O를 순차I/O로 변환해 처리할 수 있는것이 큰 장점. 

- 전문검색(Full-text search) 인덱스문서 내용 전체를 인덱스화 하여 특정 키워드가 포함된 문서 검색을 지원. 인덱싱 기법으로 크게 구분자(Stopwords)와 N-그램(N-gram) 기법이 있다. B-tree로 대체 불가능하다.

- 비트맵 인덱스 및 함수기반 인덱스MySQL에서 지원하지 않음. 함수기반 인덱스는 우회하여 쉽게 만들 수 있지만, 비트맵인덱스는 대안조차 없다.

- 클러스터링 인덱스InnoDB 및 TokuDB 엔진만 제공, 테이블의 Primary Key에 대해서만 적용되는 내용, 모든 동작이 Primary key에 많이 의존적임.

========================================================================

인덱스 종류가 이렇게 많았는지 처음 알았다.
사실, 종류라고 하기에는 그 구분 방식이 인덱스의 성격에 따라, 내부 로직에 따라 등,
제멋대로라 조금 헤깔리긴 하지만 이 포스팅에서는 이러이러한 인덱스가 있다는 것 정도만 알고 넘어가도록 한다.

다음에는 유니크 인덱스에 대한 비밀을 파헤쳐 보고자 한다.ㅎㅎ
그럼 이만 총총~





통계 위젯 (블랙)

12154
571
196097

GoogleAdsenseResponsive

Cluster map