MySQL 인덱스란?
MySQL을 사용하게 되면, 사용자가 원하는 내용을 제공해주기 위해서 많은 고민을 하게됩니다.
1 . "어떻게 하면 빠르게 정보를 검색,제공 해줄 수 있을까?" - 빠른 서비스 제공
2 . "가능한 적은 자원으로 동일한 서비스를 제공할 수 있을까?" - 효율적인 서비스 운영
위 두가지 질문을 많이 떠올린다고 생각합니다.
2번 질문은 쿼리 최적화, 캐싱의 이용과 같은 로우 레벨의 운영부분이다.
여기서는 1번 질문을 해결할 수 있는 인덱스에 대한 이야기를 해보겠습니다.
빠른 속도의 서비스 제공을 하기 위해서는 DB를 정규화하는 방법도 있지만, 다른 한편으로는 인덱스를 사용하는 방법도 있습니다.
이 글을 읽고 있는 사용자들이 어떤 DB 구조를 사용하고 있는지 모르고 있기 때문에 인덱스를 설명하는 게 DB를 빠르게 사용하는 데에 적절하다고 생각합니다.
책과 DB를 비교해보겠습니다.
찾아보기 - 인덱스
내용 - 데이터
로 생각하면 됩니다.
원하는 책의 내용을 찾을 땐, 일단 찾아보기를 보고 원하는 책의 내용이 있는 페이지 번호를 가지고 책의 내용을 찾습니다.
마찬가지로,
원하는 데이터를 찾을 땐, 일단 인덱스로 해당 데이터의 위치 주소를 찾고, 위치 주소를 가지고 해당하는 데이터를 찾습니다.
찾아보기와 인덱스의 공통점은 바로 찾기 편하게 만들기 위해서 미리 찾으려는 데이터를 정렬해서 가지고 있다는 점입니다.
미리 정렬해서 가지고 있기 때문에 찾을 때 a,b,c,d,... 또는 ㄱ,ㄴ,ㄷ,ㄹ,...과 같이 정렬된 순서대로 빠르게 검색할 수 있습니다.
DB에서 인덱스와 데이터 자료구조
: 인덱스를 왜 사용하는 지에 대해서 이야기하기에 앞서 인덱스와 데이터를 저장하는 자료구조에 대해서 이야기를 하고 시작해야합니다.
- 인덱스의 자료구조 : SortedList
- SortedList는 저장되는 값을 항상 정렬된 상태로 유지하는 자료구조입니다.
- 데이터의 자료구조 : ArrayList
- ArrayList는 저장되는 순서에 따라서 정렬없이 저장되는 값을 유지하는 자료구조입니다.
인덱스의 자료구조 SortedList의 장,단점
장점 : 이미 정렬 되어있기 때문에 DB에서 SELECT 쿼리를 사용하는 경우, 매우 빠른 속도로 원하는 결과를 검색가능합니다.
단점 : 데이터가 변화하는 INSERT, UPDATE, DELETE 쿼리를 사용하는 경우, 정렬을 해서 데이터를 저장해야하기 때문에 쿼리의 수행시간이 늘어납니다.
*즉, 인덱스 사용 이유는 데이터를 생성(INSERT),변화(UPDATE),삭제(DELETE) 성능은 저하되지만, 데이터의 읽기검색(SELECT)의 성능을 향상 시키기 위함입니다.
그래서 한 테이블에서 너무나 많은 컬럼에 인덱스를 생성하게 되면, 데이터 저장 성능이 떨어지게 됩니다.
인덱스의 역할
1) Primary Key
- 테이블의 하나의 레코드를 대표하는 컬럼 값으로 만들어진 인덱스입니다.
- 이 컬럼 값은 하나의 레코드를 식별할 수 있는 식별자로 불립니다.
- NULL을 사용할 수 없습니다.
- 중복을 허용하지 않습니다.
2) Secondary Key
- Primary Key를 제외한 나머지 모든 인덱스를 Secondary Index라고 합니다.
- 보조 인덱스 키라고도 불립니다.
인덱스의 데이터 저장 방식
: 대표적으로 세 가지 방식으로 데이터가 저장되어집니다.
1) B-Tree Index
- 가장 일반적으로 사용되는 인덱스 알고리즘입니다.
- 가장 오래된 알고리즘이고 성숙한 안정된 상태의 저장 방식입니다.
- 컬럼값을 변형하지 않고, 원래 값을 기준으로 이용해서 인덱싱하는 알고리즘입니다.
2) Hash Index
- 컬럼값을 해시값으로 계산하여 인덱싱하는 알고리즘입니다.
- 매우 빠른 속도를 지원합니다.
- 컬럼값이 해시값으로 변형되어 인덱싱에 활용되기 때문에 컬럼값의 일부분을 검색하는 경우, 불가능합니다.
- 주로 메모리 기반의 데이터베이스에서 많이 사용됩니다. 이유는 메모리 주소형태로 그 값을 모두 참조하는 형태로 사용하기 때문입니다.
3) Fractal-Tree Index
- B-Tree Index의 단점을 보완하기 위해 고안된 알고리즘입니다.
- B-Tree 처럼 컬럼 값을 변형하지 않고 인덱싱합니다.
- 데이터가 저장되거나 삭제될때, 처리하는 비용을 줄일 수 있게 설계되어서 B-Tree보다 경제적입니다.
- 다만 아직은 성숙되지 않은 인덱싱 알고리즘입니다.
인덱스의 데이터의 중복 허용 여부
: 레코드의 인덱스 값이 중복되어서 사용하는 경우와 중복하지 않고 고유값을 가지고 있는 경우로 나뉠 수 있습니다.
1) 중복 불가능한 인덱스(Unique Index)
2) 중복 가능한 인덱스(Non-Unique Index)
위의 두 가지의 인덱스 구분은 MySQL 옵티마이즈가 검색을 처리할 때 상당한 로직의 차이점을 주어줍니다. 즉, 속도의 차이로 나타나게 됩니다.
이상으로 인덱스의 설명에 대해서 마치겠습니다.