인덱스(Index)

2024. 2. 21. 15:08

인덱스(Index)는 데이터를 빠르게 검색하기 위한 자료구조이다. 책의 색인과 비슷한 개념으로, 특정 컬럼의 값과 그 값이 위치한 레코드를 참조하는 포인터를 매핑하고 있다.

 

레코드 : 데이터 행(을 가리키는 위치 정보.)

 

인덱스는 특정 컬럼의 값과 그 값의 위치 정보를 매핑하여 저장하는 자료구조이다.

작동 원리

1. 생성 : 인덱스는 하나 이상의 컬럼을 기반으로 생성된다. 이 컬럼들을 인덱스 키라고 한다. 인덱스는 키-값 쌍으로 이루어져 있으며, 키는 컬럼 값, 값은 레코드의 위치이다.

2. 검색 : 특정 컬럼 값을 검색할 때, 인덱스는 해당 컬럼 값에 해당하는 레코드의 위치를 빠르게 찾아준다.

3. 갱신 : 레코드가 삽입, 수정, 삭제될 때, 해당 레코드를 참조하는 인덱스도 함께 갱신된다.

 

특징

1. 속도 향상 : 데이터 검색 속도 크게 향상

2. 공간 사용 : 디스크 공간을 사용한다. 따라서 공간 효율성을 고려해야 한다.

3. 유지 비용 : 레코드가 갱신될 때마다 인덱스도 갱신되어야 한다. 이로 인해 쓰기 작업의 성능이 저하될 수 있다.

 

종류

1. B-Tree 인덱스 : 가장 일반적인 인덱스 형태로, 모든 컬럼 값에 대해 효율적인 검색을 제공한다.

2. 비트맵 인덱스 : 각 비트가 특정 값을 가리키는 구조로, 소수의 유니크한 값이 있는 컬럼에 효과적이다.

3. 해시 인덱스 : 해시 함수를 사용해 인덱스 키를 해시 값에 매핑하여, 특정 값의 검색을 빠르게 한다.

4. 클러스터 인덱스 : 테이블의 레코드를 인덱스 키 순서대로 저장한다. 테이블당 하나의 클러스터 인덱스를 가질 수 있다.

5. 비클러스터 인덱스 : 클러스터 인덱스와는 달리, 레코드를 키 순서대로 저장하지 않는다. 테이블당 여러 개의 비클러스터 인덱스를 가질 수 있다.

 

불필요한 인덱스는 공간을 낭비하고, 쓰기 성능을 저하시킬 수 있다.

 

인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데베 테이블의 검색 속도를 향상시키기 위한 자료구조이다.

데베에서 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회할 수 있다.

인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도, UPDATE나 DELETE의 성능이 함께 향상된다. 이유는 해당 연산을 수행하려면 해당 대상을 조회해야만 작업을 수행할 수 있기 때문이다.

 

인덱스의 관리

DBMS는 INDEX를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다. 그렇기 때문에 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.

- INSERT : 새로운 데이터에 대한 인덱스를 추가함.

- UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함.

- DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함.

 

인덱스의 장점과 단점

장점

 - 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.

 - 전반적인 시스템의 부하를 줄일 수 있다.

단점

 - 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.

 - 인덱스를 관리하기 위해 추가 작업이 필요하다.

 - 인덱스를 잘 못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.

 

만약 CREATE, UPDATE, DELETE가 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생할 수 있다. 그러한 이유 중 하나는 DELETE와 UPDATE 연산 때문이다. 기존의 인덱스를 삭제하지 않고 사용하지 않음 처리를 해줌으로써 인덱스가 점점 누적되는 문제가 발생. SQL문 처리 시 비대해진 인덱스에 의해 오히려 성능이 떨어지게 될 것이다.

 

인덱스를 사용하면 좋은 경우

 - 규모가 작지 않은 테이블

 - INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼

 - JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼

 - 데이터의 중복도가 낮은 컬럼

 

인덱스 사용 만큼이나 생성된 인덱스 관리도 중요하다. 사용되지 않는 인덱스는 바로 제거해주어야 한다.

 

자료구조

1. 해시 테이블(Hash Table)

 - 해시 테이블은 (key, value)로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 유용하다. 해시 테이블은 key값을 이용해 고유한 index를 생성하여 그 index에 저장된 값을 꺼내오는 구조이다.

해시 테이블 기반의 DB 인덱스는 (데이터=컬럼의 값, 데이터의 위치)를 (KEY, VALUE)로 사용하여 컬럼의 값으로 생성된 해시를 통해 인덱스를 구현한다. 검색하려는 키 값을 해시 함수에 넣어서 해시 값을 계산하고, 그 해시 값에 해당하는 위치에서 값을 바로 찾아온다. 시간복잡도는 O(1)이며 매우 빠른 검색을 지원한다.

하지만 해시가 등호(=) 연산에만 특화되었기 때문에 제한적으로 사용된다. 해시 함수는 값이 1이라도 달라지면 완전히 다른 해시 값을 생성하는데, 이러한 특성에 의해 부등호 연산(<, >)이 자주 사용되는 데베 검색을 위해서는 해시 테이블이 적합하지 않다.

즉 예를 들면 나는 으로 시작하는 모든 데이터를 검색하기 위한 쿼리문은 인덱스의 혜택을 전혀 받지 못하게 된다. 이러한 이유로 데베의 인덱스에서는 B+Tree가 일반적으로 사용된다.

 

2. B+Tree

 - DB의 인덱스를 위해 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다. B+Tree는 모든 노드에 데이터(Value)를 저장했던 B-Tree와 다른 특성을 가지고 있다.

 

3. B-Tree

 - 컬럼의 값을 변형하지 않고, 원래의 값을 이용해 인덱싱하는 알고리즘.

 

B-Tree VS B+Tree

 

 

Fractal-Tree 알고리즘

 

인덱스 타입

1. Primary(클러스터) 인덱스

 - 테이블의 레코드를 인덱스 키의 순서대로 물리적으로 저장하는 방식이다. 이렇게 하면 인덱스 키에 대한 검색이 매우 빠르고, 키의 범위에 해당하는 레코드를 가져오는 것도 효율적이다.

클러스터 인덱스에서는 주로 기본키(pk)가 인덱스 키로 사용된다. 이 방식으로 데이터를 저장하면, 검색할 키 값에 대한 레코드가 디스크의 어디에 저장되어 있는지 바로 알 수 있다. 따라서 디스크 I/O를 줄이고 검색 속도를 빠르게 할 수 있다.

그러나 주의할 점은 테이블당 하나의 클러스터 인덱스만 가질 수 있다는 것이다. 왜냐하면 레코드는 한 번에 하나의 순서로만 물리적으로 정렬될 수 있기 때문이다. 따라서 어떤 키를 클러스터 인덱스로 사용할지는 신중하게 결정해야 한다.

그리고 클러스터 인덱스를 사용하면 데이터 삽입, 수정, 삭제 시에 오버헤드가 발생할 수 있다. 왜냐하면 레코드를 인덱스 키 순서대로 유지하기 위해 레코드의 물리적인 위치를 변경해야 할 수 있기 때문이다.

 

 

 

2. Secondary(보조) 인덱스 = 논클러스터 인덱스 

 - 개념적으로는 후보키에만 부여할 수 있는 인덱스다 (고유 식별 번호, 주민번호 같이 각 데이터를 인식할 수 있는 최소한의 고유 식별 속성 집합)

 - 보조 인덱스의 생성시에는 데이터 페이지는 그대로 둔 상태에서 별도의 페이지에 인덱스를 구성한다.

 - 별도의 페이지에서 인덱스를 구성하니, 클러스터와는 달리 자동 정렬을 하지 않는다.

 - 보조 인덱스의 리프 페이지는 데이터가 아니라 데이터가 위치하는 주소값(RID)

 - 클러스터형보다 검색 속도는 느리지만 데이터의 입력/수정/삭제는 덜 느리다.

 - 보조 인덱스는 여러 개 생성할 수 있다. 그러나 함부로 사용시 오히려 성능 저하 가능하다.

 - 각 데이터에 대해서 고유 값(UNIQUE)들이 있는 목록에 생성할 수 있는 인덱스다.(UNIQUE KEY)

 - 보조 인덱스 역시 루트 페이지가 만들어진다.

하지만 데이터 페이지에 바로 연결시키지 않고 따로 리프페이지를 만들어서 매핑을 하고 정렬시킨다.

 - 이처럼 추가 공간이 필요하므로 마구 인덱스를 남용하면 공간 낭비로 이어질 수도 있다.

 - 데이터 페이지는 변화를 주지 않는다. 따라서 클러스터 인덱스와 달리 여러개 생성이 가능하다.

 

클러스터 + 보조 인덱스

 - 

 

인덱스 설계

 

 

 

 

 

 

 

 

 

출처 : https://mangkyu.tistory.com/96

 

[Database] 인덱스(index)란?

1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는 내

mangkyu.tistory.com

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%EC%9D%B8%EB%8D%B1%EC%8A%A4index-%ED%95%B5%EC%8B%AC-%EC%84%A4%EA%B3%84-%EC%82%AC%EC%9A%A9-%EB%AC%B8%EB%B2%95-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

[MYSQL] 📚 인덱스(index) 핵심 설계 & 사용 문법 💯 총정리

인덱스의 개념 인덱스란 데이터의 저장(INSERT, UPDATE, DELETE) 의 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높이는 테이블의 동작속도(조회)를 높여주는 자료구조이다. 쉽게 예를 들어보면

inpa.tistory.com

 

'Database' 카테고리의 다른 글

정규화  (0) 2024.05.15
트랜잭션(Transaction)  (0) 2024.02.21
NoSQL  (0) 2024.02.15

BELATED ARTICLES

more