JOIN과 UNION, VARCHAR과 CHAR의 관계, 인덱스
1. JOIN
INNER JOIN
- 짝(파트너)가 있어야만 들어갈 수 있는 파티장이라고 보면 된다.
- 두 테이블의 교집합 데이터를 조회. 즉, 양쪽 테이블에 공통적으로 존재하는 데이터만 가져온다.
SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id;
OUTER JOIN
- 짝이 있는 사람도 OK, 없는 사람도 OK. 파티장이라고 보면 된다.
- 조건에 따라 공통 데이터와 함께 한쪽 테이블에만 존재하는 데이터도 조회 가능.
LEFT (OUTER) JOIN
- 왼쪽 테이블의 모든 데이터 + 오른쪽 테이블과 일치하는 데이터.
RIGHT (OUTER) JOIN
- 오른쪽 테이블의 모든 데이터 + 왼쪽 테이블과 일치하는 데이터.
FULL OUTER JOIN
- 양쪽 테이블의 모든 데이터. 일치 여부 상관없이 가져온다.
SELECT *
FROM table1
LEFT JOIN table2
ON table1.id = table2.id;
2. UNION과 UNION ALL
- UNION: 두 쿼리의 결과를 합치면서 중복된 데이터를 제거.
- UNION ALL: 중복된 데이터를 제거하지 않고 모두 합친다.
SELECT column1 FROM table1
UNION
SELECT column1 FROM table2;
SELECT column1 FROM table1
UNION ALL
SELECT column1 FROM table2;
3. VARCHAR와 CHAR의 차이
- VARCHAR: 가변 길이 문자열. 저장되는 문자열 길이에 따라 공간을 사용.
- CHAR: 고정 길이 문자열. 정의된 길이만큼 공간을 항상 사용.
유형 특징
VARCHAR |
메모리 효율적, 유동적 저장 |
CHAR |
고정된 길이, 속도가 빠름 |
4. DELETE와 TRUNCATE의 차이
- DELETE: 테이블의 데이터를 삭제하며, 조건을 지정할 수 있다.
- 데이터만 삭제, 테이블의 구조와 인덱스는 유지.
- 트랜잭션 가능 (롤백 지원).
- TRUNCATE: 테이블의 모든 데이터를 삭제하며, 인덱스도 초기화된다.
- 조건 지정 불가능.
- 트랜잭션 불가능 (롤백 불가).
DELETE FROM table_name WHERE condition;
TRUNCATE TABLE table_name;
5. 인덱스
인덱스를 사용하는 이유
- 빠르게 데이터를 검색하기 위해 사용한다.
- 인덱스가 있으면 쿼리 성능이 크게 향상될 수 있다.
인덱스 생성 기준
- PK, UNIQUE, FK는 자동 생성: 기본적으로 주요 키에 대해 인덱스가 생성된다.
- 불필요하면 사용하지 않는다: 인덱스는 공간을 차지하고, 쓰기 성능을 저하시킬 수 있다.
- 운영 중 느려지면 추가: 초기 설계 시 불필요한 인덱스는 피하고, 필요 시 추가.
- 중복이 낮은 곳에 생성: 중복 값이 많으면 인덱스 효과가 감소.
- 자주 검색되는 컬럼에 생성: 검색 쿼리에 자주 사용되는 컬럼에 인덱스를 생성한다.
CREATE INDEX index_name ON table_name(column_name);
주의사항
- 인덱스는 읽기 성능은 높이지만 쓰기 성능은 저하시킬 수 있다.
- 지나치게 많은 인덱스는 오히려 성능 저하를 유발할 수 있다.