제43장. INDEX "데이터를 더 빨리 찾을 수 있을까요?"
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- INDEX가 필요한 이유를 설명할 수 있다.
- INDEX의 역할을 이해할 수 있다.
- INDEX를 생성하고 삭제할 수 있다.
- INDEX의 장점과 단점을 설명할 수 있다.
책에서 원하는 내용을 찾으려면?
500페이지짜리 책이 있다고 생각해 봅시다.
"데이터베이스"라는 단어를 찾으려면 어떻게 할까요?
첫 장부터 한 장씩 읽을 수도 있습니다.
하지만 대부분은
책 뒤쪽의 색인(Index) 을 먼저 찾아봅니다.
색인을 보면
데이터베이스 ........ 35, 72, 180
처럼 페이지 번호가 적혀 있습니다.
바로 원하는 페이지를 찾을 수 있습니다.
데이터베이스도 같습니다.
데이터가 몇 개 없으면
처음부터 하나씩 찾아도 됩니다.
하지만
100만 개,
1000만 개가 되면
검색 속도가 매우 느려집니다.
그래서 사용하는 것이
INDEX입니다.
INDEX란 무엇일까요?
INDEX는
데이터를
더 빨리 찾기 위한
색인입니다.
데이터를 따로 저장하는 것이 아니라
어디에 데이터가 있는지를 빠르게 찾을 수 있도록 도와주는 정보
입니다.
그림으로 이해하기
Customers
1
2
3
4
5
6
7
8
9
10
↓
INDEX
Alfreds → 1
Ana → 2
Antonio → 3
...
검색할 때는
INDEX를 먼저 찾습니다.
그 다음
원하는 데이터를 바로 찾아갑니다.
INDEX가 없으면?
고객 찾기
↓
1번 확인
↓
2번 확인
↓
3번 확인
↓
...
↓
100만 번째 확인
모든 데이터를
차례대로 검사해야 할 수도 있습니다.
INDEX가 있으면?
INDEX 검색
↓
위치 확인
↓
바로 이동
↓
데이터 읽기
훨씬 빠르게
데이터를 찾을 수 있습니다.
INDEX 만들기
다음과 같이 작성합니다.
CREATE INDEX idx_customername
ON Customers(CustomerName);
SQL를 한 줄씩 살펴보기
CREATE INDEX idx_customername
idx_customername이라는
INDEX를 생성합니다.
ON Customers(CustomerName);
Customers 테이블의
CustomerName 열에
INDEX를 만듭니다.
INDEX 사용하기
다음 SQL는
변하지 않습니다.
SELECT *
FROM Customers
WHERE CustomerName='Alfreds Futterkiste';
INDEX를 만들었다고 해서
SELECT 문이 달라지는 것은 아닙니다.
MySQL이
자동으로 INDEX를 사용합니다.
실제 업무에서는?
예를 들어
학교 학생이
5명이라면
이름을 하나씩 찾아도 됩니다.
하지만
학생이
100만 명이라면?
처음부터 모두 검사하면
오래 걸립니다.
그래서
학생 이름에 INDEX를 만들어 둡니다.
검색 속도가
매우 빨라집니다.
INDEX의 장점
장점 ①
검색 속도가 빨라집니다.
장점 ②
JOIN에서도 도움이 됩니다.
JOIN은
같은 값을 계속 비교합니다.
INDEX가 있으면
비교 속도가 빨라질 수 있습니다.
장점 ③
정렬에도 도움이 되는 경우가 있습니다.
ORDER BY에서도
INDEX를 활용하는 경우가 있습니다.
INDEX의 단점
좋은 점만 있는 것은 아닙니다.
단점 ①
저장 공간이 조금 더 필요합니다.
INDEX도
추가 정보를 저장하기 때문입니다.
단점 ②
INSERT가 조금 느려질 수 있습니다.
새로운 데이터를 추가하면
INDEX도 함께 수정해야 합니다.
단점 ③
UPDATE도 영향을 받을 수 있습니다.
INDEX가 있는 값을 수정하면
INDEX도 다시 정리해야 합니다.
단점 ④
DELETE도 약간 느려질 수 있습니다.
데이터를 삭제하면서
INDEX도 함께 수정됩니다.
언제 INDEX를 만들까요?
다음과 같은 열에는
INDEX를 많이 사용합니다.
- 고객 번호(CustomerID)
- 회원 아이디(UserID)
- 이메일(E-mail)
- 주문 번호(OrderID)
즉,
자주 검색하는 열
입니다.
반대로
거의 검색하지 않는 열에는
굳이 INDEX를 만들지 않습니다.
INDEX 삭제하기
필요 없으면
삭제할 수도 있습니다.
DROP INDEX idx_customername
ON Customers;
많이 하는 실수
실수 ①
모든 열에 INDEX를 만든다.
INDEX는 많다고
무조건 좋은 것이 아닙니다.
실수 ②
검색하지 않는 열에도 INDEX를 만든다.
INDEX는
필요한 곳에만 만드는 것이 좋습니다.
실수 ③
INDEX를 만들면
모든 SQL이 빨라진다고 생각한다.
조회는 빨라질 수 있지만
INSERT,
UPDATE,
DELETE는
조금 느려질 수도 있습니다.
한눈에 정리
| 명령 | 설명 |
| CREATE INDEX | INDEX 생성 |
| DROP INDEX | INDEX 삭제 |
| INDEX | 검색 속도를 높여 준다. |
이번 장 핵심 정리
✅ INDEX는 데이터를 더 빨리 찾기 위한 색인이다.
✅ SELECT 문은 그대로 사용해도 MySQL이 INDEX를 자동으로 활용한다.
✅ 자주 검색하는 열에 INDEX를 만든다.
✅ INDEX가 많아지면 저장 공간이 늘어나고 데이터 수정 작업은 조금 느려질 수 있다.
연습 문제
기본 문제
① Customers 테이블의 Country 열에 idx_country라는 INDEX를 생성하는 SQL을 작성하시오.
② idx_country INDEX를 삭제하는 SQL을 작성하시오.
응용 문제
다음 중 INDEX를 만드는 것이 가장 적절한 열을 고르시오.
① CustomerName
② Memo (긴 메모)
③ OrderID
④ Country
도전 문제
다음 문장을 읽고 이유를 설명하시오.
"INDEX는 많을수록 좋은 것이 아니다."
정답
기본 문제
CREATE INDEX idx_country
ON Customers(Country);
DROP INDEX idx_country
ON Customers;
응용 문제
정답
③ OrderID
(①도 자주 검색한다면 좋은 후보가 될 수 있지만, 일반적으로 기본키나 주문번호처럼 검색 빈도가 높은 열이 가장 적합합니다.)
💡 실무 이야기
데이터가 몇백 건 정도인 실습 환경에서는 INDEX의 효과를 체감하기 어렵습니다. 하지만 실제 쇼핑몰, 은행, 학교 행정 시스템처럼 수백만 건 이상의 데이터가 저장된 환경에서는 INDEX의 유무에 따라 조회 시간이 몇 초에서 몇 밀리초(ms) 수준으로 달라질 수도 있습니다.
하지만 "조회 속도가 느리니 INDEX를 더 만들자!"는 생각은 위험합니다. INDEX가 많아질수록 데이터를 추가·수정·삭제할 때 관리해야 할 정보도 늘어나기 때문입니다.
실무에서는 데이터베이스 관리자가 어떤 SQL이 자주 실행되는지를 분석한 뒤, 꼭 필요한 열에만 INDEX를 생성합니다.
✨ 다음 장 예고
다음 장에서는 TRANSACTION(트랜잭션) 을 배워 보겠습니다.
지금까지 우리는 INSERT, UPDATE, DELETE를 자유롭게 사용할 수 있게 되었습니다.
하지만 실제 업무에서는 여러 SQL을 하나의 작업으로 묶어 모두 성공하거나, 모두 취소해야 하는 경우가 있습니다.
예를 들어 은행 계좌 이체에서는 한 계좌에서 돈을 빼고 다른 계좌에 넣는 두 작업이 모두 성공해야 합니다.
다음 장에서는 이러한 문제를 해결하는 트랜잭션을 배우며, 지금까지 익힌 CRUD를 더욱 안전하게 사용하는 방법을 익혀 보겠습니다.
'프로그래밍 > MySQL' 카테고리의 다른 글
| 📊 [SQL] 제46장 종합 프로젝트 - 작은 쇼핑몰 데이터베이스를 관리해 봅시다! (0) | 2026.07.31 |
|---|---|
| 📊 [SQL] 제44장 TRANSACTION - 실수한 작업을 되돌릴 수 있을까요? (0) | 2026.07.31 |
| 📊 [SQL] 제42장 VIEW - 복잡한 SELECT를 저장해 둘 수 있을까요? (0) | 2026.07.21 |
| 📊 [SQL] 제41장 DELETE(3) - DELETE와 TRUNCATE, DROP은 무엇이 다를까요? (0) | 2026.07.21 |
| 📊 [SQL] 제40장 DELETE(2) - 여러 개의 데이터를 한 번에 삭제할 수 있을까요? (0) | 2026.07.15 |