새소식

📘 기초 지식/Database

[DB] Index, 인덱스란?

  • -

인덱스란(Index)?

 

인덱스는 데이터베이스 테이블에 대한 검색 속도를 높여주는 자료 구조이다.

 

특정 컬럼에 인덱스를 생성하면 해당 컬럼의 데이터들을 정렬하여 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 이렇게 인덱스가 생성되면 앞으로 쿼리문에 인덱스 생성 컬럼을 WHERE 조건으로 거는 등의 작업을 하면 옵티마이저에서 판단하여 생성된 인덱스를 탈 수 있다.

 

아래 그림과 같이 인덱스를 타게 되고 먼저 인덱스에 저장되어 있는 데이터의 물리적 주소로 가서 데이터를 가져오는 식으로 동작하여 검색 속도를 향상시킨다.

인덱스는 책에 있는 목차라고 생각하면 편하다. 우리가 책에서 정보를 찾을 때도 먼저 원하는 카테고리를 목차에서 찾고 목차에 있는 페이지 번호를 보고 찾아가듯 인덱스도 내가 원하는 데이터를 먼저 찾고 저장되어 있는 물리적 주소로 찾아간다.

 

실제 DB 관련 작업을 할 때 대부분의 속도 저하는 바로 SELECT문 특지 조건 검색 WHERE절에서 발생하는데 가장 먼저 생각해 볼 수 있는 대안으로 Index를 생각할 수 있기도 하고, SQL 튜닝에서도  Index와 관련된 문제상항과 해결책이 많기 때문이다.

 

 

인덱스(Index)를 사용하는 이유

 

인덱스의 가장 큰 특징은 데이터들이 정렬 되어있다는 점이다. 이 특징으로 인해 조건 검색이라는 영역에서 굉장한 장점이 된다.

 

  1.  조건 검색 where 절의 효율성
    테이블을 만들고 데이터가 쌓이게 되면 데이터는 순서가 없이 저장된다. 이렇게 되면 where절에 특정 조건에 맞는 데이터들을 찾아낼 때도 처음부터 끝까지 검색 조건과 맞는지 비교해야 한다. 이것을 풀 테이블 스캔(Full Table Scan)이라고 한다. 하지만 인덱스 테이블은 데이터들이 정렬되어 저장되기 때문에 해당 조건에 맞는 데이터들을 빠르게 찾을 수 있다. 이것이 인덱스를 사용하는 가장 큰 이유이다.

  2. 정렬 Order by 절의 효율성
    인덱스를 사용하면 Order by에 의한 정렬 과정을 피할 수가 있다. Order by는 굉장히 부하가 많이 걸리는 작업이다. 정렬과 동시에 1차적으로 메모리에서 정렬이 이루어지고 메모리보다 큰 작업이 필요하다면 디스크 I/O도 추가적으로 발생한다. 하지만 인덱스를 사용하면 이러한 전반적인 자원의 소모를 하지 않아도 된다.

  3. MIN, MAX의 효율적인 처리 가능
    이것 또한 데이터가 정렬되어 있기에 얻을 수 있는 장점이다. MIX값과 MAX값을 레코드의 시작값과 끝값 한건씩만 가져오면 되기에 Full Table Scan으로 테이블을 다 뒤져서 작업하는 것보다 훨씬 효율적이다

 

인덱스의 단점

 

인덱스의 가장 큰 문제점은 정렬된 상태를 계속 유지시켜줘야 한다는 점이다. 그렇기에 레코드 내에 데이터값이 바뀌는 부분이라면 악영향을 미친다.  데이터가 추가되거나 값이 바뀐다면 Index 테이블 내에 있는 값들을 다시 정렬을 해야한다. 그리고 Index 테이블, 원본 테이블 이렇게 두 곳의 데이터 수정 작업을 해야한다는 단점도 있다.

 

그리고 검색을 할 때도 인덱스가 무조건 좋은 것은 아니다. 인덱스는 테이블의 전체 데이터 중에서 10~15% 이하의 데이터를 처리하는 경우에만 효율적이고 그 이상의 데이터를 처리할 때에는 인덱스를 사용하지 않는 것이 더 낫다. 그리고 인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다. 무턱대고 Index를 만들어서는 안될 것이다.

 

 

인덱스 생성 전략

 

생성된 인덱스를 가장 효율적으로 사용하려면 데이터의 분포도는 최대한으로 그리고 조건절에 호출 빈도는 자주 사용되는 컬럼을 인덱스로 생성하는 것이 좋다. 인덱스는 특정 컬럼을 기준으로 생성하고 기준이 된 컬럼으로 정렬된 Index 테이블이 생성된다. 이 기준 컬럼은 최대한 중복이 되지 않는 값이 좋다. 가장 최선은 PK에 인덱스를 거는 것인데 중복된 값이 없는 인덱스 테이블이 최적의 효율을 발생시키고 반대로 모든 값이 같은 컬럼이 인덱스 컬럼이 된다면 인덱스로써의 가치가 없는 것이다.

 

  1. 조건절에 자주 등장하는 컬럼
  2. 항상 =으로 비교되는 컬럼
  3. 중복되는 데이터가 최소한인 컬럼
  4. Order by 절에서 자주 사용되는 컬럼
  5. 조인 조건으로 자주 사용되는 컬럼

 

B * Tree 인덱스

 

인덱스에는 여러가지 유형이 있지만 그 중에서도 가장 많이 사용하는 인덱스의 구조는 밸런스드 트리 인덱스 구조이다. 

그리고 B TREE 인덱스 중에서도 가장 많이 사용하는것은 B*TREE 와 B+TREE 구조를 가장 많이 사용되는 인덱스의 구조다.

B * Tree 인덱스는 대부분의 DBMS 그리고 오라클에서 특히 중점적으로 사용하고 있는 가장 보편적인 인덱스이다. 구조는 위와 같이 Root(기준) / Branch(중간) / Leaf(말단) Node로 구성된다.

 

특정 컬럼에 인덱스를 생성하는 순간 컬럼의 값들을 정렬하는데, 정렬한 순서가 중간 쯤 되는 데이터를 뿌리에 해당하는 ROOT 블록으로 지정하고 ROOT 블록을 기준으로 가지가 되는 BRANCH블록을 정의하며 마지막으로 잎에 해당하는 LEAF 블록에 인덱스의 키가 되는 데이터와 데이터의 물리적 주소 정보인 ROWID를 저장한다.

'📘 기초 지식 > Database' 카테고리의 다른 글

[DB] Redis란?  (0) 2023.04.21
[DB] Transaction, 트랜잭션이란?  (0) 2023.04.18
[DB] Hikari CP 알아보기  (0) 2023.04.18
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.