Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- JAVA기초
- OPP개념
- 집합관계
- 형 변환
- While
- 상수
- 접근제어지시자
- 시스템 환경 변수 편집
- break문
- 포함관계
- 자바 멀티스레딩
- multi-threading
- 컴파일
- IntelliJ IDEA
- this예약어
- 생성자
- 인텔리제이 한글 깨짐 해결법
- 메서드 오버로딩
- 인텔리제이 기초 설정
- for문
- Java데이터 타입
- JAVA객체지향
- java변수
- Thread
- function
- 연관관계
- continue문
- 반복문
- Java
- 메서드
Archives
- Today
- Total
최원종의 개발 블로그
인덱스(Index) - 11 본문

인덱스가 필요한 이유
예시 : 쇼핑몰에 상품이 100만 개 있습니다.
특정 카테고리의 상품을 조회하면 MySQL 은 어떻게 할까요?
인덱스 없이:
상품 1번부터 100만 번까지 하나씩 비교
→ 시간이 오래 걸림 (Full Table Scan)
인덱스 있으면:
인덱스에서 카테고리 위치를 바로 찾아서 해당 데이터만 조회
→ 수십 배 빠름
//책의 색인(찾아보기) 과 동일한 개념
자바 책에서 "인터페이스" 를 찾을 때:
전체 탐색: 1페이지부터 끝까지 읽기 → 느림
색인 활용: 맨 뒤 색인에서 "인터페이스 → 142p" 확인 → 빠름
MySQL 인덱스도 동일:
특정 컬럼에 대한 정렬된 데이터 구조를 별도로 저장
→ 조건 검색 시 전체 스캔 없이 바로 위치 찾기
자동으로 생성되는 인덱스
-- PRIMARY KEY 선언 시 자동으로 인덱스 생성
student_id INT PRIMARY KEY
-- UNIQUE 선언 시 자동으로 인덱스 생성
email VARCHAR(100) UNIQUE
실습코드
create database demo2;
-- 테이블 생성 시 인덱스를 추가하는 벙법
create table product(
id int primary key auto_increment,
category_id int not null,
name varchar(100) not null,
price decimal(10, 2) not null,
stock int default 0,
index idx_category (category_id),
index idx_name (name)
);
select * from product;
desc product;
-- 테이블 생성 이후에 인덱스를 추가 하는 방법
alter table product add INDEX idx_price (price);
-- 또는 create 사용해 됨
create index idx_price on product (price);
-- 인덱스를 확인 하는 방법
show index from product;
-- 인덱스를 삭제 하는 방법
drop index idx_price ON product;
인덱스 실습코드
-- 인덱스 실습
use shop;
-- 문제 1. product, orders, member 테이블 현재 인덱스를 확인해 보자.
show index from product;
show index from orders;
show index from member;
desc member;
-- 문제2 member 테이블에 grade 컬럼에 인덱스 추가 (VIP 회원 조회시 자주 사용)
alter table member add index idx_grade (grade);
-- 문제3. orders 테이블에 status 인덱스 추가 (주문 상태별 조회 시 자주 사용)
alter table orders add index idx_status (status);
-- 문제4. member 테이블에 grade에 걸린 인덱스 삭제
drop index idx_grade on member;
인덱스 장단점
장점:
SELECT, WHERE, JOIN, ORDER BY 쿼리 속도 향상
대용량 데이터에서 특히 효과적
단점:
별도 저장 공간 필요 (인덱스도 디스크를 차지함)
INSERT, UPDATE, DELETE 시 인덱스도 함께 갱신 → 약간 느려짐
언제 추가하면 좋을까?
WHERE 조건에 자주 사용되는 컬럼
JOIN 조건에 사용되는 FK 컬럼
ORDER BY 에 자주 사용되는 컬럼
데이터가 많고 조회가 잦은 테이블
추가하지 않는 게 나은 경우:
데이터가 매우 적은 테이블 (몇십 건)
값의 종류가 적은 컬럼 (예: 성별 - 남/여 2종류)
INSERT/UPDATE/DELETE 가 매우 잦은 컬럼
실제 서비스에서의 인덱스
쇼핑몰 상품 목록 API:
SELECT * FROM product WHERE category_id = 1 ORDER BY price;
→ category_id, price 에 인덱스 있으면 빠름
회원 로그인 처리:
SELECT * FROM member WHERE email = 'user@test.com';
→ email 에 UNIQUE 인덱스 → 자동으로 빠름
주문 내역 조회:
SELECT * FROM orders WHERE member_id = 1 AND status = '배송중';
→ member_id (FK), status 에 인덱스 있으면 빠름
핵심 요약
인덱스 = 책의 색인
특정 컬럼의 데이터를 정렬해서 별도 저장
조회 속도 향상, 쓰기 속도는 약간 저하
자동 생성
PRIMARY KEY, UNIQUE 선언 시 자동
수동 추가
ALTER TABLE 테이블명 ADD INDEX 인덱스명 (컬럼명);
확인/삭제
SHOW INDEX FROM 테이블명;
DROP INDEX 인덱스명 ON 테이블명;
테이블 생성시 문법 (테이블 끝에 구문 추가)
INDEX idx_category (category_id), -- category_id 에 인덱스
INDEX idx_name (name) -- name 에 인덱스
WHERE, JOIN, ORDER BY 에 자주 쓰이는 컬럼에 추가
'MySQL' 카테고리의 다른 글
| 관계 차수 - 13 (0) | 2026.04.04 |
|---|---|
| MySQL 기초 복습 - 12 (0) | 2026.04.03 |
| PRIMARY KEY, UNIQUE, FOREIGN KEY - 10 (0) | 2026.04.03 |
| UPDATE 와 DELETE - 9 (0) | 2026.04.03 |
| SELECT 와 WHERE - 8 (0) | 2026.04.03 |
