본문 바로가기
DB/RDB

키, 인덱스, 실행계획, 테이블의 관계

by doriver 2022. 11. 3.

테이블 간의 관계를 명확하게 하고, 테이블 자체의 인덱스를 위해 설정된 장치

 

(1) Key(Index)
가장 일반적인 Key는 Index 와 동의어이다.
중복을 허용하며 NULL 등의 허용도 가능하지만, NULL 이 허용될 경우 색인에 있어 비약적인 성능 저하를 가져오므로 일반적으로 Nullable 한 데이터의 경우 Indexing 하지 않는다.
단순히 Key, 즉 Index 로만 지정할 경우에는 별도에 제약조건(Constraint)을 가지지 않기 때문에 테이블 내에 데이터에 대해 엄격한 정합성이 요구될 경우에는 적합하지 않다.

(2) Primary Key (기본키)
NOT NULL & UNIQUE 옵션이 포함되며 테이블 당 단 하나의 정의만 가질 수 있다.
PK 로 단 하나의 칼럼이 지정되어 있다면 해당 칼럼의 데이터는 Table 내에서 유일성이 보장되며, 여러 개가 PK 로 지정되어 있다면 해당 칼럼 들의 조합에 대해 유일성이 보장된다.

(3) Unique Key
Uniqueness 를 지닌 Index를 말하며, Unique Index 라 부르기도 한다.
PK 와 마찬가지로 중복성이 허용되지 않지만 NULL 에 대한 허용이 가능하다.
테이블당 여러개를 가질 수 있다.

(4) Foreign Key (외래키)
다른 테이블의 PK를 그대로 참조하는 Column 을 FK 라고 한다.
다른 테이블과의 연결을 위한 키로, 실무에선 사용하지 않는다.

 

# 테이블 생성과 같이 Index 생성
# 이름, 전공, 학번
CREATE TABLE `student` (
	`id` int NOT NULL AUTO_INCREMENT primary key,
    `name` varchar(16) NOT NULL, 
    `major` varchar(16) NOT NULL, 
    `number` varchar(32) NOT NULL,
    INDEX `idx_name` (`name`),
    UNIQUE INDEX `idx_number` (`number`),
    INDEX `idx_name_major` (`name`, `major`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

show index from student;

drop table `student`;

CREATE TABLE `student` (
    `id` int NOT NULL AUTO_INCREMENT primary key,
    `name` varchar(16) NOT NULL, 
    `major` varchar(16) NOT NULL, 
    `number` varchar(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

# 일반 인덱스 추가 
ALTER TABLE `student` ADD INDEX `idx_name` (`name`);

# UNIQ INDEX 추가 
ALTER TABLE `student` ADD UNIQUE INDEX `idx_number` (`number`);

# 복합 인덱스 추가 
ALTER TABLE `student` ADD INDEX `idx_name_major` (`name`, `major`);

 

인덱스

데이터를 빠르게 찾을수 있는 장치

인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 빠르게 찾을수 있다.

보통 'B-트리' 라는 자료구조로 이루어져 있다

 

https://dorivertt.tistory.com/201

 

MySQL 튜닝 , 성능 최적화를 위한 MySQL Explain

MySQL 튜닝에서 가장 중요한 것은 쿼리와 스키마 최적화이다. 스키마 설계는 한번 진행되면 그 테이블을 사용하는 모든 쿼리에 영향을 주기 때문에 좀처럼 변경하기 힘들지만 쿼리는 해당 쿼리만

dorivertt.tistory.com

실행 계획(성능) 보기

 MySQL 쿼리 옵티마이저는 쿼리를 실행할때 최적의 계획을 세운다. 그 계획을 Database용어로 '실행계획'(Query Plan)이라고 하는데, MySQL에서는 'EXPLAIN' 키워드를 이용해 실행계획에 대한 정보를 살펴 볼 수 있다.

인덱스가 여러개인 경우 하나만 선택된다.

explain 쿼리문;

 

성능이 안좋은 type부터 나열되어 있음

type 설명
all 테이블 Full Scan(테이블 크기가 크다면 성능 개선 필수)
index 인덱스 Full Scan(인덱스 전체 조회. 테이블 크기가 크다면 성능 개선 필수)
range 인덱스를 사용한 범위 검색
ref key = value 형태의 조회
eq_ref 테이블 간의 JOIN에서 PK 또는 Unique Key가 이용된 경우
const PK 또는 Unique Key로 조회된 경우. 최고의 성능.

 

테이블의 관계

DB에는 여러 테이블이 있고, 테이블 사이에 관계가 정의되 있다
1:1관계   ,   1:N관계   ,   N:M관계( 1:N , 1:M 로 나눠서 )

 

 

 

'DB > RDB' 카테고리의 다른 글

Select 문, Part2  (0) 2022.11.12
Select 문, Part1  (0) 2022.11.12
DB 구성 과정  (1) 2022.11.03
이상현상 , 정규화와 역정규화  (0) 2022.10.26
Query 01  (0) 2022.08.24