CHAR 와 VARCHAR 비교
- CHAR : 검색속도 빠름, 실제저장되는 데이터양에 상관없이 저장용량 소모
- VARCHAR : 검색속도 느림, 실제저장되는 데이터양에 따라 저장용량 소모
| 구분 | CHAR | VARCHAR |
| 저장 방식 | 고정 길이 | 가변 길이 |
| 저장 공간 | 선언한 길이만큼 고정 | 실제 데이터 길이 + 1~2바이트 |
| 검색 속도 | 빠름 | 느림 |
| 용량 효율 | 낮음 | 높음 |
| 사용 예시 | 성별(M/F), 주민번호 등 고정 길이 데이터 | 이름, 주소 등 가변 길이 데이터 |
인덱스(Index)란?
인덱스는 부가 데이터이다.
특정 컬럼에 인덱스를 생성하면 MySQL이 별도의 정렬된 데이터를 관리한다.
검색할 때 전체 테이블을 모두 확인하는 것이 아니라 필요한 위치만 탐색한다.
인덱스를 걸었다는 것은 해당 컬럼을 기준으로 검색하기 위한 별도의 데이터를 생성했다는 의미이다.
왜 인덱스가 빠를까?
데이터가 정렬되어 있다면 순차 탐색보다 이진 탐색(Binary Search) 이 훨씬 빠르다.
인덱스는 정렬된 컬럼 정보를 따로 관리하는 데이터이기 때문에 원하는 데이터를 빠르게 찾을 수 있다.
즉, 인덱스는 고속 검색을 위한 지도(Map) 역할을 한다.
인덱스 종류
| 종류 | 설명 | 특징 |
| PRIMARY KEY | 주키 인덱스 | 유니크 + 클러스터 인덱스 유니크 인덱스는 발견즉시 탐색을 중지하기 때문에 검색속도가 일반 인덱스보다 더 빠르다. |
| UNIQUE INDEX | 유니크 인덱스 | 중복을 허용하지 않는 인덱스 |
| NORMAL INDEX | 일반 인덱스 | 유니크 없는 일반 인덱스 |
| FULLTEXT INDEX | 풀텍스트 인덱스 | 본문검색에 사용할 수 있는 인덱스(한글 지원x) 엘라스틱 서치가 필요한 이유 |
PRIMARY KEY와 UNIQUE INDEX 차이
| PRIMARY KEY | UNIQUE INDEX |
| 클러스터형 인덱스 | 비클러스터형 인덱스 |
| 테이블당 1개 | 여러 개 생성 가능 |
| NOT NULL | NULL 허용 가능(MySQL 특성) |
| 가장 빠른 검색 | 매우 빠른 검색 |
인덱스 장점
- SELECT 속도가 크게 향상된다.
- Full Scan 대신 Index Scan을 수행한다.
- 대부분의 시스템은 조회가 80% 이상이므로 효과가 크다.
- UNIQUE INDEX는 값을 찾으면 바로 탐색을 종료한다.
인덱스 단점
인덱스도 하나의 데이터이기 때문에 관리 비용이 발생해서 INSERT, UPDATE, DELETE가 느려진다.
데이터가 변경될 때마다 인덱스도 함께 수정되어야 하기 때문이다.
언제 인덱스를 걸어야 할까?
무조건 인덱스를 생성하는 것은 좋지 않다.
다음과 같은 경우에 고려하는 것이 좋다.
- 조회가 자주 발생하는 컬럼
- 검색 조건으로 자주 사용하는 컬럼
- 시스템 속도가 느려졌을 때
실무에서는 Slow Query Log를 통해 느린 SQL을 찾고 필요한 곳에만 인덱스를 추가하는 경우가 많다.
인덱스 생성
CREATE INDEX loginId
ON member(loginId);
또는
ALTER TABLE member
ADD INDEX(loginId);
인덱스를 생성하면 MySQL이 자동으로 검색용 데이터를 만든다.
UNIQUE INDEX 생성
테이블 생성 시 함께 생성할 수도 있다.
loginId CHAR(100) UNIQUE
또는
UNIQUE KEY(loginId)
EXPLAIN
EXPLAIN은 SQL이 어떤 방식으로 실행되는지 확인하는 명령어이다.
XPLAIN FORMAT=TRADITIONAL
SELECT *
FROM member
WHERE loginId = 'user1';
인덱스를 사용하면 실행 계획에서 인덱스를 이용하는 것을 확인할 수 있다.
인덱스 삭제
DROP INDEX loginId
ON member;
'데이터베이스 > MySQL' 카테고리의 다른 글
| [MySQL] 외래키(FOREIGN KEY) (0) | 2026.07.30 |
|---|---|
| [MySQL] 집계 함수, GROUP BY, 서브쿼리 (0) | 2026.07.29 |
| [MySQL] JOIN, LEFT JOIN, RIGHT JOIN (0) | 2026.07.29 |
| [MySQL] SELECT 심화 (0) | 2026.07.29 |
| [MySQL] 기초 명령어 (0) | 2026.07.28 |
댓글