최원종의 개발 블로그

인덱스(Index) - 11 본문

MySQL

인덱스(Index) - 11

chl6698 2026. 4. 3. 12:42

 

 

인덱스가 필요한 이유

예시 : 쇼핑몰에 상품이 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