데이터베이스 - 인덱스

지환·2023년 8월 28일
0

Mysql

목록 보기
12/17
post-thumbnail

출처 | https://daegwonkim.tistory.com/176
https://www.youtube.com/watch?v=THZjyppzu90&list=PLVsNizTWUw7Hox7NMhenT-bulldCp9HP9&index=37

인덱스의 개념

만약에 책에서 '폭푸스 모델' 이라는 단어가 나온 부부분을 찾는다고 가정하면,

책의 '찾아보기' 개념이다.

인덱스가 없으면 select 할 때, 대용량이면 소모되는 시간이 많아진다.

인덱스의 장점

SELECT 문으로 검색하는 속도가 매우 빨라진다.

그 결과 컴퓨터의 부담이 줄어들어 결국 전체 시스템의 성능이 향상된다.

인덱스의 단점

인덱스도 공간을 차지해서 데이터베이스 안에 추가적인 공간이 필요하다. (대략 테이블 크기의 10% 정도의 공간 필요)

처음에 인덱스를 만드는 데 시간이 오래 걸릴 수 있다.

SELECT가 아닌 데이터의 변경 작업(INSERT, UPDATE, DELETE)이 자주 일어나면 오히려 성능이 떨어질 수 있다.

MySQL에서 사용되는 인덱스의 종류는 크게 두 가지로 나뉘는데,
클러스터형 인덱스(Clustered Index)보조 인덱스(Secondary Index)이다.

이 두 개를 쉽게 비교하면 클러스터형 인덱스는 영어사전과 같고, 보조 인덱스는 책 뒤에 찾아보기가 있는 일반적인 책과 같다.

보조 인덱스는

일반적인 책과 같이 찾아보기가 별도로 있고, 찾아보기에서 해당 단어를 찾은 후에 옆에 표시된 페이지를 펼쳐야 실제 찾는 내용이 있는 것을 말한다.

클러스터형 인덱스는

영어사전처럼 책의 내용이 이미 알파벳 순서대로 정렬되어 있는 것이다. 따라서 별도의 찾아보기가 없고 책 자체가 찾아보기가 되는 것이다.

인덱스는 테이블의 열 단위에 생성되며, 하나의 열에는 하나의 인덱스를 생성할 수 있다.

테이블을 생성할 때 기본 키로 지정된 열이 있다면 해당 열에는 자동적으로 클러스터형 인덱스가 생성된다.

즉, 해당 열을 기준으로 데이터가 정렬되는 것을 확인할 수 있다.

테이블 생성 시에 제약 조건(Primary key) 또는 Unique를 사용하면 자동으로 인덱스가 자동 생성된다.

USE sqldb;
CREATE TABLE  tbl1
	(	a INT PRIMARY KEY,
		b INT,
		c INT
	);

SHOW INDEX FROM tbl1;

CREATE TABLE  tbl2
	(	a INT PRIMARY KEY, -- 클러스터 인덱스
		b INT UNIQUE, -- 보조 인덱스
		c INT UNIQUE,
		d INT
	);
SHOW INDEX FROM tbl2;

CREATE TABLE  tbl3
	(	a INT UNIQUE,
		b INT UNIQUE,
		c INT UNIQUE,
		d INT
	);
SHOW INDEX FROM tbl3; --> 전부 보조 인덱스

CREATE TABLE  tbl4
	(	a INT UNIQUE NOT NULL, -- not null이여서 이 부분이 클러스터 인덱스로 봐도 된다.
		b INT UNIQUE ,
		c INT UNIQUE,
		d INT
	);
SHOW INDEX FROM tbl4;

CREATE TABLE  tbl5
	(	a INT UNIQUE NOT NULL, -- 보조인덱스
		b INT UNIQUE , -- 보조인덱스
		c INT UNIQUE, -- 보조인덱스
		d INT PRIMARY KEY -- 클러스터인덱스
	);
SHOW INDEX FROM tbl5;

실습

CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
DROP TABLE IF EXISTS usertbl;
CREATE TABLE usertbl 
( userID  char(8) NOT NULL PRIMARY KEY, 
  name    varchar(10) NOT NULL,
  birthYear   int NOT NULL,
  addr	  nchar(2) NOT NULL 
 );


INSERT INTO usertbl VALUES('LSG', '이승기', 1987, '서울');
INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남');
INSERT INTO usertbl VALUES('KKH', '김경호', 1971, '전남');
INSERT INTO usertbl VALUES('JYP', '조용필', 1950, '경기');
INSERT INTO usertbl VALUES('SSK', '성시경', 1979, '서울');
SELECT * FROM usertbl;

ALTER TABLE usertbl DROP PRIMARY KEY ;
ALTER TABLE usertbl 
	ADD CONSTRAINT pk_name PRIMARY KEY(name);
SELECT * FROM usertbl;

userid로 자동으로 정렬을 진행한다.[primary key]

즉, 클러스터형 인덱스는 테이블 당 하나만 존재하며 보조 인덱스는 여러 개 존재할 수 있다

정리

  • PRIMARY KEY로 지정한 열은 클러스터형 인덱스가 생성된다.

  • UNIQUE NOT NULL로 지정한 열은 클러스터형 인덱스가 생성된다.

  • UNIQUE(또는 UNIQUE NULL)로 지정한 열은 보조 인덱스가 생성된다.

  • PRIMARY KEY와 UNIQUE NOT NULL이 있으면 PRIMARY KEY로 지정한 열에 우선 클러스터형 인덱스가 생성된다.

  • PRIMARY KEY로 지정한 열로 데이터가 오름차순 정렬한다.

profile
아는만큼보인다.

0개의 댓글