참고한 영상
[10분 테코톡] 라라, 제로의 데이터베이스 인덱스
색인 : 쉽게 찾아볼수 있도록 일정한 순서에 따라 놓은 목록
원하는 값을 빠르게 찾는다! → SELECT
데이터가 기준 없이 저장된 상태일 경우 조회를 위해 많은 시간이 소요된다.
데이터가 특정 기준으로 정렬되어있다면, 검색을 빠르게 할 수 있을 것이다.
이메일을 인덱스로 정한 경우 → 빠르게 찾을 수 있다!
SELECT * FROM member
WHERE email = ‘abc@gmail.com’
[1] 인덱스가 적용된 대상 (email 로 정렬된 데이터)
[2] WHERE 절을 통해 검색
페이지 : 데이터가 저장되는 단위 (MySQL - 16 Kbyte)
특징 : 순차적으로 처음부터 페이지에 접근하기 때문에 접근 비용 감소
Full Table Scan이 사용되는 경우
이러한 이진 탐색 트리의 단점을 극복하기 위해 나온 자료구조 중 하나 B-Tree (Balanced-Tree)
B-Tree
SELECT
INSERT로 인한 페이지 분할
페이지에 새로운 데이터를 추가할 여유공간이 없을 경우 INSERT를 위해 페이지 확보
문제가 발생한 페이지의 데이터를 공평하게 저장한다
⇒ 페이지 분할 특징
DELETE
UPDATE
DELETE와 UPDATE에 WHERE 조건절 사용하게 되면?
데이터베이스에서 클러스터링이란 실제 데이터와 무리를 이룬다는 것을 의미하고,
클러스터링 인덱스는 실제 데이터와 같은 무리의 인덱스를 의미한다. 예) 실제 데이터가 정렬되어 있는 사전
논-클러스터링 이란 실제 데이터와 무리를 이루지 않음을 의미하고, 논-클러스터링 인덱스란 실제 데이터와 다른 무리의 별도의 인덱스를 의미한다. 예) 실제 데이터 탐색에 도움을 주는 책 뒤의 별도의 찾아보기 페이지
CREATE TABLE member (
id int primary key,
name varchar(255),
email varchar(255) unique
);
위에 코드로 테이블을 생성하면 인덱스가 두개 생성된다. 한 컬럼에 primary key를 적용하면 클러스터링 인덱스가 자동생성 된다. 그리고 unique 제약조건을 걸면 논-클러스터링 인덱스가 자동생성된다.
[방법1]
ALTER TABLE 테이블명 ADD CONSTRAINT pk_id **PRIMARY KEY** (id) ;
[방법2]
ALTER TABLE 테이블명 MODIFY COLUMN id int **NOT NULL**;
ALTER TABLE 테이블명 ADD CONSTRAINT nuq_id **UNIQUE** (id) ;
클러스터링 인덱스 추가 → 적용한 컬럼 기준 데이터 정렬 → 정렬된 데이터 기준으로 루트 페이지, 리프 페이지 생성 (b-tree 구조) → 리프 페이지가 데이터 변화에 맞추어 동기화된다.
[방법1] 한 컬럼에 UNIQUE 제약조건을 걸어 생성한다
ALTER TABLE 테이블명 ADD CONSTRAINT unq_name **PRIMARY KEY** (name) ;
[방법2] UNIQUE INDEX를 생성한다. (중복 허용 X)
CREATE UNIQUE INDEX unq_idx_name ON 테이블명 (name) ;
[방법3] 디폴트 INDEX를 생성한다. (중복 허용)
CREATE INDEX unq_idx_name ON 테이블명 (name) ;
실제 데이터가 저장된 데이터 페이지는 어떠한 정렬이나 변경도 일어나지 않는다
데이터 페이지가 리프 페이지였던 클러스터링 인덱스와 달리 별도의 name에 대한 인덱스 페이지가 추가로 생성된다.
특징
- 실제 데이터 페이지는 그대로
- 별도의 인덱스 페이지 생성 → 추가 공간 필요
- 테이블당 여러개 존재 가능
- 리프 페이지에 실제 데이터 페이지 주소를 담고 있음
- unique 제약조건 적용시 자동 생성
- 직접 index 생성시 논-클러스처링 인덱스 생성
잘 활용되지 않는 인덱스는 제거하자
데이터 중복도가 높은 컬럼은 인덱스 효과가 작다
자주 사용되더라도 INSERT/UPDATE/DELETE가 자주 일어나는지 고려해야 한다.