1. 인덱스(Index)란?
▷ 책의 <찾아보기>의 개념과 비슷
▷ 데이터를 좀 더 빠르게 찾을 수 있도록 해주는 도구
◎ 인덱스의 장단점
▷ 장점
▶ 검색 속도가 무척 빨라질 수 있음 (항상 그런 것은 아님)
→ 책도 너무 두꺼우면 찾기 어렵기 때문입니다.
▶ 쿼리의 부하가 줄어들어 시스템 전체의 성능 향상
▷ 단점
▶ 인덱스가 데이터베이스 공간을 차지해서 추가적인 공간 필요
→ 대략 데이터베이스 크기의 10% 정도의 추가 공간 필요
▶ 처음 인덱스 생성하는데 시간 소요
▶ 데이터의 변경 작업 (Insert, Update, Delete)이 자주 일어나는 경우 성능이 나빠질 수도 있음
◎ 인덱스의 종류
▷ 클러스터형 인덱스 (Clustered Index)
▶ 기본키
▶ ‘영어 사전’과 같은 책
▶ 테이블 당 한 개만 지정 가능
▶ 행 데이터를 인덱스로 지정한 열에 맞춰 자동 정렬
▶ 기본키로 지정되면 오름차순으로 자동 정렬됩니다.
use sqldb; select * from usertbl; -- 기본키 변경 : -- 1. buytbl의 외래키 설정 제거 -- 2. usertbl의 기본키 제거 -- 3. usertbl의 name 컬럼을 기본키 지정 alter table buytbl drop foreign key buytbl_ibfk_1; alter table usertbl drop primary key; alter table usertbl add constraint pk_name primary key (name); -- 이름 기준으로 자동 정렬 되어 있는 것을 확인할 수 있음 select * from usertbl; desc usertbl; -- 테이블 생성시에 제약조건 primary key 또는 unique를 사용하면 자동으로 인덱스가 생성 show index from usertbl;
▷ 보조 인덱스 (Secondary Index)
▶ UNIQUE
▶ 책 뒤에 <찾아보기>가 있는 일반 책
▶ 테이블당 여러 개도 생성 가능
1. 인덱스 실습(기본키 설정)
create table tbl1 ( a int primary key, b int, c int ); show index from tbl1;
2. 인덱스 실습(기본키와 Unique 추가)
create table tbl2 ( a int primary key, b int unique, c int unique ); show index from tbl2; -- tbl2 0 PRIMARY 1 a A 0 BTREE -- tbl2 0 b 1 b A 0 YES BTREE -- tbl2 0 c 1 c A 0 YES BTREE drop table tbl2;
3. 인덱스 실습(기본키와 Unique 추가 2)
-- unique index : 중복 값이 없는 인덱스(클러스터 인덱스 : primary key, unique) -- nonunique index : 중복 값이 있는 인덱스(1 : nonunique, 0 : unique) create table tbl3 ( a int primary key, b int unique, c int unique, d int ); show index from tbl3;
4. 기본키 없이 Unique만 지정UNIQUE에 클러스터형 인덱스 지정
-- unique만 사용 create table tbl4 ( a int unique, b int unique, c int unique, d int ); show index from tbl4;
unique에 not null이 포함되면 클러스터형 인덱스로 지정됨5. UNIQUE에 클러스터형 인덱스 지정
-- unique와 not null 동시 사용 -- primary가 없고 unique가 not null이면 클러스터 인덱스로 사용 -- unique는 보조 인덱스 create table tbl5 ( a int unique not null, b int unique, c int unique, d int ); show index from tbl5;
6. unique에 not null과 primary키를 동시 지정
-- unique와 not null, primary key 동시 사용 create table tbl6 ( a int unique not null, -- 클러스터 인덱스 : 자동 정렬 b int unique, -- 보조 인덱스 : 정렬x c int unique, d int primary key -- 클러스터 인덱스 : 자동 정렬 ); show index from tbl6; -- 기본 값이 먼저 우선적으로 자동 정렬 -- primary key로 지정한 열은 클러스터형 인덱스가 생성 -- unique not null로 지정한 열은 클러스터형 인덱스가 생성 -- unique 또는 unique null로 지정한 보조 열은 보조 인덱스가 생성 -- primary key와 unique not null이 있으면 primary key로 지정한 열을 우선 클러스터형 인덱스가 생성 -- primary key로 지정한 열로 데이터가 오름차순 정렬된다.
◎ 인덱스의 특징
▷ PRIMARY KEY로 지정한 열은 클러스터형 인덱스가 생성
▷ UNIQUE NOT NULL로 지정한 열은 클러스터형 인덱스 생성
▷ UNIQUE(또는 UNIQUE NULL)로 지정한 열은 보조 인덱스 생성
▷ PRIMARY KEY와 UNIQUE NOT NULL이 존재
▷ PRIMARY KEY와 UNIQUE NOT NULL이 있으면 PRIMARY KEY에 지정한 열에 우선 클러스터형 인덱스 생성
▷ PRIMARY KEY로 지정한 열로 데이터가 오름차순 정렬
2. 인덱스의 내부 작동
◎ B-Tree(Balanced Tree, 균형 트리)
▷ 자료 구조’에 나오는 범용적으로 사용되는 데이터 구조
▷ 인덱스 표현할 때와 그 외에도 많이 사용
◎ 페이지 분할
▷ 인덱스 구성시 SELECT 문의 효율성 향상
▷ 인덱스 구성시 INSERT 문이 일어날 경우 속도 저하되는 단점
▶ 주어진 공간 이상으로 데이터 들어가면 페이지 분할 일어남
◎ 클러스터형 인덱스와 보조 인덱스의 구조
▷ 인덱스 없는 테이블의 예시
-- 인덱스가 없는 테이블 : 데이터를 입력한 순서대로 출력이 된다. create database if not exists testdb; use testdb; drop table if exists clustertbl; create table clustertbl -- cluster table의 약자 ( userID CHAR(8), name VARCHAR(10) ); INSERT INTO clustertbl VALUES('LSG', '이승기'); INSERT INTO clustertbl VALUES('KBS', '김범수'); INSERT INTO clustertbl VALUES('KKH', '김경호'); INSERT INTO clustertbl VALUES('JYP', '조용필'); INSERT INTO clustertbl VALUES('SSK', '성시경'); INSERT INTO clustertbl VALUES('LJB', '임재범'); INSERT INTO clustertbl VALUES('YJS', '윤종신'); INSERT INTO clustertbl VALUES('EJW', '은지원'); INSERT INTO clustertbl VALUES('JKW', '조관우'); INSERT INTO clustertbl VALUES('BBK', '바비킴'); select * from clustertbl; -- 인덱스 없는 테이블 <- 클러스터형 인덱스 추가 : primary key(자동정렬) alter table clustertbl add constraint PK_clustertbl_userID primary key (userID); select * from clustertbl;
▷ 클러스터형 인덱스 구성한 테이블 구조
▷ userID를 Primary Key로 지정하면 클러스터형 인덱스로 구성됨
▷ 클러스터형 인덱스 구성한 테이블 구조
▷ 보조 인덱스 구성한 테이블 구조
-- 보조 인덱스 추가 create table secondarytbl ( userID CHAR(8), name VARCHAR(10) ); INSERT INTO secondarytbl VALUES('LSG', '이승기'); INSERT INTO secondarytbl VALUES('KBS', '김범수'); INSERT INTO secondarytbl VALUES('KKH', '김경호'); INSERT INTO secondarytbl VALUES('JYP', '조용필'); INSERT INTO secondarytbl VALUES('SSK', '성시경'); INSERT INTO secondarytbl VALUES('LJB', '임재범'); INSERT INTO secondarytbl VALUES('YJS', '윤종신'); INSERT INTO secondarytbl VALUES('EJW', '은지원'); INSERT INTO secondarytbl VALUES('JKW', '조관우'); INSERT INTO secondarytbl VALUES('BBK', '바비킴'); -- 유니크를 이용한 보조 인덱스 생성 (자동 정렬 x) alter table secondarytbl add constraint uk_secondarytbl_userID unique (userID); select * from secondarytbl;
▷ 클러스터 인덱스에 새로운 데이터 입력
▷ 보조 인덱스에 새로운 데이터 입력
◎ 클러스터형 인덱스의 특징
1. 클러스터형 인덱스의 생성 시에는 데이터 페이지 전체 다시 정렬
▷ 이미 대용량의 데이터가 입력된 상태라면 업무시간에 클러스터형 인덱스 생성하는 것은 심각한 시스템 부하
2. 인덱스 자체의 리프 페이지가 곧 데이터
▷ 인덱스 자체에 데이터가 포함되어 있음
3. 클러스터형 인덱스는 보조 인덱스보다 검색 속도는 더 빠름
▷ 데이터의 입력/수정/삭제는 더 느림
4. 클러스터형 인덱스는 성능이 좋지만 테이블에 한 개만 생성 가능
▷ 어느 열에 클러스터형 인덱스 생성하는지에 따라 시스템의 성능이 달라짐
◎ 보조 인덱스의 특징
1. 보조 인덱스 생성시 별도의 페이지에 인덱스 구성
2. 인덱스 자체의 리프 페이지는 데이터가 아니고 데이터가 위치하는 주소 값(RID)
3. 클러스터형보다 검색 속도는 더 느림
▷ 데이터의 입력/수정/삭제는 덜 느림
4. 보조 인덱스는 여러 개 생성할 수 있음
▷ 남용할 경우에는 시스템 성능을 떨어뜨리는 결과 발생
◎ 클러스터형 인덱스와 보조 인덱스가 혼합되어 있을 경우
1. 보조 인덱스를 검색한 후에 다시 클러스터형 인덱스를 검색해야 하므로 약간의 손해를 볼 수도 있겠지만, 데이터의 삽입 때문에 보조 인덱스를 대폭 재구성하게 되는 큰 부하는 걸리지 않음
2. 보조 인덱스와 혼합되어 사용되는 경우 되도록이면 클러스터형 인덱스로 설정할 열은 적은 자릿수의 열을 선택하는 것이 바람직함
3. 인덱스를 검색하기 위한 일차 조건
▷ WHERE절에 해당 인덱스를 생성한 열의 이름이 나와야 함
▷ WHERE절에 해당 인덱스를 생성한 열 이름이 나와도 인덱스를 사용하지 않는 경우도 많음
데이터를 좀 더 빠르게 찾아보기 위해서 index를 사용합니다. 기본키도 index 기능이 있기 때문에 자동으로 오름차순 정렬이 되고 외래키, Unique Key도 마찬가지 입니다! 하지만 기본키가 제일 우선순위가 높네요!!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > DB(SQL)' 카테고리의 다른 글
[DB_MySQL] 이것이 MySQL이다 ch10 스토어드 프로그램 2(스토어드 함수) (0) | 2023.02.11 |
---|---|
[DB_MySQL] 이것이 MySQL이다 ch10 스토어드 프로그램 1(스토어드 프로시저, Stored Procedure) (0) | 2023.02.10 |
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 3(테이블스페이스) (0) | 2023.02.09 |
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 2(뷰, view) (0) | 2023.02.09 |
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 1-1(테이블 제약 조건 및 수정 방법 실습) (0) | 2023.02.09 |