본문 바로가기
CS/DB

인덱스

by 넬준 2021. 12. 6.

인덱스는 테이블의 특정 열을 특정 자료구조에 맞게 정리한 것으로, I/O 빈도를 줄이고, 

해당 자료구조에 맞는 특정 알고리즘으로 데이터를 빠르게 검색하는데 사용한다.

 

즉, 인덱스의 역할은 검색속도의 향상이다.

인덱스가 없으면 MySQL은 처음부터 끝까지 전체 테이블을 검색한다. (full table scan)

 

DBMS의 인덱스는 레코드의 키 값을 기준으로 항상 정렬되어 있다. 

 

항상 정렬되어 있기 때문에, 주로 SELECT 명령의 검색을 빠르게 하기 위해 사용한다.
테이블에 데이터를 INSERT, UPDATE, DELETE 할 때는 인덱스를 정렬하는 작업도 같이 하기 때문에,
데이터의 변경이 자주 일어나는 테이블에서는 인덱스의 사용을 조심해야 한다.

 

인덱스의 자료구조는 B-tree(혹은 B+tree) 방식이 가장 많이 쓰인다.

- 페이지가 노드이다.

- 페이지끼리는 양방향 탐색이 가능한 이중 연결이고, 레코드끼리는 단일 연결이다.

 

 

인덱스 종류

 

Clustered 인덱스

  • 한 테이블에 단 하나만 존재할 수 있다.
  • Non-clustered 인덱스보다 검색은 빠르고, 변경(INSERT, UPDATE, DELETE)은 느리다.
  • 생성 시, 인덱스로 지정한 컬럼이 오름차순으로 자동으로 정렬되고 그에 맞춰서 row 데이터도 정렬한다.
  • Primary Key로 설정한 컬럼이 있으면 자동으로 생성된다.
    UNIQUE NOT NULL 제약이 걸린 컬럼이 있으면 생성된다.
    둘 다 있을 경우, Primary Key로 설정한 컬럼의 Index가 Clustered 인덱스가 된다.
  • 인덱스의 리프 페이지가 바로 데이터 페이지이므로 실제 데이터가 인덱스에 저장(포함)되어 있다.
    데이터 검색 순서 : 루트 페이지 -> 리프 페이지(데이터 페이지)
  • 데이터가 INSERT 될 때마다 루트 페이지, 리프 페이지를 재정렬한다.

 

Non-clustered 인덱스 (보조 인덱스)

- 보조 인덱스는 보통 '유일한 값을 가진 필드이나 정렬되지 않은 데이터 파일'에 대한 인덱스를 지칭하나 

MySQL에서는 클러스터 인덱스를 제외한 나머지 인덱스를 의미한다.

- Unique index, Foreign key index, Column index 등

- Column Index는 다른 인덱스와 다르게 중복값을 가지는 속성으로 만들 수 있다.

또한, 복수의 칼럼으로 인덱스를 지정할 수도 있다. 이 경우는, 작성한 칼럼의 순서대로 보조키를 정렬한다.

 

  • 한 테이블에 여러 개를 생성할 수 있다.
  • UNIQUE나 UNIQUE NULL 제약이 있는 컬럼이 있으면 생성된다.
  • 인덱스와 데이터를 따로 저장한다.
    인덱스는 해당 데이터의 위치에 대한 포인터를 참조한다.
  • 데이터 검색 순서 : 루트 페이지 -> 리프 페이지 -> 데이터 페이지
    리프 페이지에는 클러스터 인덱스에 접근하기 위한 클러스터 키를 저장한다.
  • 리프 페이지에서 얻은 클러스터 키를 가지고 클러스터 인덱스에서 루트 페이지부터 탐색해나간다.

 

 

 


참고

https://velog.io/@gillog/SQL-Index인덱스 

https://zorba91.tistory.com/293

https://gaeggu.tistory.com/7

https://jaehoney.tistory.com/57

https://nangkyeong.tistory.com/entry/이것이-MySQL이다로-정리해보는-인덱스-개념 

https://jie0025.tistory.com/107

https://mongyang.tistory.com/75

https://www.codelatte.io/courses/database_basic/HJEK2EOJTS408VTU

'CS > DB' 카테고리의 다른 글

제약 (Constraint)  (0) 2022.08.14
(MySQL) INNER JOIN  (0) 2022.08.12
DELETE / TRUNCATE / DROP 비교  (0) 2021.12.04
테이블 생성 / 삭제 / 변경  (0) 2021.12.04
데이터베이스 계층 구조  (0) 2021.12.04

댓글