인덱스는 테이블의 특정 열을 특정 자료구조에 맞게 정리한 것으로, 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://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 |
댓글