키
테이블 간의 관계를 명확하게 하고, 테이블 자체의 인덱스를 위해 설정된 장치
(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 |