인덱스(영어: index)는 데이터베이스 분야에 있어서 테이블에 대한 동작의 속도를 높여주는 자료 구조를 일컫는다. 인덱스는 테이블 내의 1개의 컬럼, 혹은 여러 개의 컬럼을 이용하여 생성될 수 있다. 고속의 검색 동작뿐만 아니라 레코드 접근과 관련 효율적인 순서 매김 동작에 대한 기초를 제공한다. 인덱스를 저장하는 데 필요한 디스크 공간은 보통 테이블을 저장하는 데 필요한 디스크 공간보다 작다. (왜냐하면 보통 인덱스는 키-필드만 갖고 있고, 테이블의 다른 세부 항목들은 갖고 있지 않기 때문이다.) 관계형 데이터베이스에서는 인덱스는 테이블 부분에 대한 하나의 사본이다. 인덱스는 고유 제약 조건을 실현하기 위해서도 사용된다. 고유 인덱스는 중복된 항목이 등록되는 것을 금지하기 때문에 인덱스의 대상인 테이블에서 고유성이 보장된다. - 위키백과
INDEX = 색인
EX) 만쪽이 넘는 책에서 내가 원하는 부분을 찾을려고 할 때 한장한장 넘겨가면서 찾으면 백만년 걸림
➡️ 색인이나 목차는 한번에 찾을 수 있음
DB 의 인덱스도 DB 에 대한 색인이나 목차라고 생각하면 된다. 없는 경우 테이블의 처음부터 끝(table full scan)까지 모두 뒤져야 하지만 인덱스가 걸려 있다면 더욱 빠르게 찾을 수 있다
인덱스로 들어온 칼럼값들은 값을 정렬하여 순차적으로 저장됨
➡️ 새로운 데이터 값이 들어오는 경우 이를 순차적으로 찾아 정리하기 때문에 새로운 데이터를 insert, delete 하는 것은 시간이 오래 걸리지만 search 는 빨리 됨
파일이름 | 설명 |
---|---|
FRM | 테이블 구조 저장 파일 |
MYD | 실제 데이터 파일 |
MYI | Index 정보 파일 (Index 사용 시 생성) |
저장된 user 가 10만 명일 때 아래 SQL 을 실행하는 경우
select *
from users
where user_id = 55555
DB buffer cache
에 user_id 가 55555 인 user 가 있는지 확인한다. 하드 디스크 파일
에서 55555 정보를 가진 블록을 복사해서 DB buffer cache
로 가져온 후 55555 정보만 골라내서 사용자에게 보여줌인덱스 없을 때 ❎ : 55555 정보가 어떤 블록에 들어 있을지 모르기 때문에 10만개 전부를 DB buffer cache
로 복사한 후 하나하나 찾는다.
인덱스가 있을 때 🅾️ : where 절의 컬럼이 index 가 만들어져 있는지 확인 후, 인덱스에 먼저 가서 55555 정보가 어떤 ROWID 를 가지고 있는지 확인한 후 해당 ROWID 에 있는 블록만 찾아가서 DB buffer cache
에 복사한다.
🚨 데이터 베이스 서버에 성능 문제가 발생했다 !!!
라고 하면 가장 빨리 생각하는 해결책이 인덱스 추가 생성이다.
하지만, 계속적으로 인덱스를 생성해서 인덱스가 쌓여 가게 되면 전체적인 데이터베이스의 성능 부하를 초래한다. 조회 성능을 극대화하려 만들었지만 여러 인덱스가 쌓여서 Insert, Delete, Update 시에 부하가 발생해 전체적인 데이터베이스 성능을 저하한다.
그렇기 때문에 일차적으로 SQL 문을 좀 더 효율적으로 짜는 방향을 고민해야 하고, 그다음 수단으로 인덱스 생성을 생각해야 한다.
O(logN)
이다. 페이지를 알고 있어서 해당 페이지를 바로 펼침
⭐️ MySQL에서 Clustered Index
1순위 Primary Key
2순위 UNIQUE 하면서 NOT NULL 인 컬럼
3순위 임의로 보이지 않는 컬럼
클러스터 인덱스 구조
클러스터 인덱스 검색
select * from test where name = 'FFF'
1. 인덱스의 루트 페이지를 접근해서 찾는 값이 어떤 리프 페이지(=데이터 페이지)에 있는지 확인
2. 리프 페이지로 이동 후에 페이지 내부 행들을 검색해서 해당 데이터를 찾음 -> 총 2개의 페이지 (루트페이지, 리프페이지) 를 참조
클러스터 인덱스 데이터 삽입
목차에서 찾고자 하는 내용의 페이지를 찾고 나서 해당 페이지로 이동
Secondary Index 구조
Secondary Index 검색
select * from test where name = 'FFF'
Secondary Index 삽입
제목 | 내용 | 설명 |
---|---|---|
Extra | Using index | 커버링 인덱스 (쿼리의 모든 항목이 인덱스 컬럼으로 이루어진 상태) |
Extra | Using index condition | 인덱스 컨디션 푸시다운 인덱스 |
type | index | 인덱스 풀 스캔 (range 스캔이 아님) |
WHERE + GROUP BY (index : a,b,c)
장점
1. 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
2. 전반적인 시스템의 부하를 줄일 수 있다.
단점
1. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
2. 인덱스를 관리하기 위해 추가 작업이 필요하다.
3. 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
=> INSERT, UPDATE, DELETE 등의 액션이 발생했을 때 인덱스를 최신의 정렬된 상태로 유지하기 위해서 추가적인 연산 필요
[Database] DB 인덱싱(Indexing)이란?
[SQL] Index(인덱스)
[SQL] Clustered Index & Non-Clustered Index
[자료구조] 그림으로 알아보는 B+Tree
1. 커버링 인덱스 (기본 지식 / WHERE / GROUP BY)