Infra/Performance

MySQL 인덱스를 활용한 성능 최적화

baek-dev 2025. 3. 21. 18:31

MySQL에서 인덱스(Index)를 사용한 성능 최적화란?

 

MySQL에서 인덱스(Index)를 사용한 성능 최적화란, 데이터베이스가 특정 데이터를 빠르게 찾을 수 있도록 데이터의 위치를 미리 정리하여 보관하는 방법임.

 

인덱스는 흔히 도서관의 책 색인에 비유할 수 있음.

 

예를 들어, 도서관에서 특정 주제의 책을 찾으려면, 책 전체를 하나씩 확인하는 대신 색인을 보고 원하는 책을 바로 찾는 것과 같음.

인덱스를 설정하면 MySQL 역시 데이터를 빠르게 검색할 수 있게 됨.

 


인덱스가 없을 때의 문제점 (성능 저하)

 

먼저, 인덱스가 없을 경우의 문제를 알아보겠음.

 

예를 들어, 다음과 같은 테이블이 있다고 가정함:

 

예시 테이블 (user):

id username age email
1 kim 25 kim@test.com
2 lee 28 lee@test.com
3 park 30 park@test.com

 

만약 이 테이블에서 특정 email을 가진 유저를 찾는다고 가정함:

SELECT * FROM user WHERE email = 'lee@test.com';

 

인덱스가 없다면(MySQL은):

 **테이블 전체를 처음부터 끝까지 순차적으로 스캔(Full Table Scan)**해야 함.

 데이터가 많아질수록 검색에 걸리는 시간이 늘어남.

 

데이터가 수백만 건, 수천만 건 이상이 되면 성능은 매우 떨어지게 됨.

 


인덱스를 사용한 성능 개선 원리

 

MySQL에서 인덱스는 일반적으로 **B+Tree(비플러스 트리)**라는 자료구조를 사용함.

 

B+Tree는 데이터가 항상 정렬된 상태로 유지되며, 데이터를 찾을 때 매우 빠르게 찾을 수 있도록 설계된 구조임.

 

즉, 데이터의 위치 정보를 미리 정리해둬서, 검색할 때 빠르게 접근할 수 있게 됨.

 


MySQL에서 인덱스 생성법 (기본 사용법)

 

인덱스는 자주 검색 조건으로 쓰이는 컬럼에 설정함.

 

문법 예시:

CREATE INDEX 인덱스명 ON 테이블명 (컬럼명);

 

예를 들어, 앞에서 언급한 이메일로 자주 검색한다면 아래와 같이 인덱스를 걸어줄 수 있음:

CREATE INDEX idx_email ON user(email);

 

이렇게 하면 MySQL은 email 컬럼을 기반으로 별도의 인덱스 테이블을 만듦.

 

이제 다시 이메일 검색 쿼리를 실행하면 MySQL은 더 이상 전체 데이터를 다 보지 않고, 인덱스에서 바로 위치를 찾아서 데이터를 빠르게 가져옴.

 


인덱스를 적용한 이후의 성능 개선 과정

 

인덱스를 적용한 뒤에 MySQL의 데이터 검색 과정은 다음과 같음.

1. 쿼리 실행 (SELECT * FROM user WHERE email = 'lee@test.com';)

2. MySQL이 설정된 인덱스 테이블(idx_email)을 바로 확인하여 email='lee@test.com' 데이터를 매우 빠르게 찾음.

3. 찾은 데이터의 실제 위치를 참고해서 메인 테이블에서 해당 데이터를 즉시 가져옴.

 

결국 테이블의 전체 데이터를 다 검색하지 않기 때문에, 조회 속도가 극적으로 빨라짐.

 


인덱스 적용 시 주의사항

 

인덱스는 검색 성능을 빠르게 하지만, 항상 좋은 것만은 아니므로 주의사항이 있음.

 데이터 추가(INSERT), 수정(UPDATE), 삭제(DELETE)의 속도는 오히려 느려질 수 있음.

 데이터가 변경될 때마다 인덱스도 같이 업데이트되어야 하기 때문임.

 너무 많은 컬럼에 인덱스를 걸면 저장공간을 과도하게 사용하고, 오히려 성능이 저하될 수 있음.

 정확히 자주 검색되는 컬럼만 선택하여 인덱스를 설정하는 것이 좋음.

 


인덱스 적용 시 효과가 큰 경우 (적용 추천 상황)

 자주 조건문(WHERE)에 사용되는 컬럼

 JOIN 조건에 자주 사용되는 컬럼

 자주 정렬(ORDER BY)이나 그룹화(GROUP BY)에 사용되는 컬럼

 외래 키(Foreign Key)를 설정할 때 (외래 키는 자동으로 인덱스가 생성됨)

 


인덱스 설정 여부에 따른 성능 차이 간단 예시

조건 속도 방식
인덱스가 없을 때 (Full Scan) 매우 느림 전체 데이터를 순차적으로 확인함
인덱스가 있을 때 (Index Scan) 매우 빠름 미리 정렬된 위치 정보로 바로 접근 가능

실제로 큰 규모의 데이터를 다룰수록, 인덱스의 유무에 따라 쿼리의 성능 차이는 극단적으로 벌어질 수 있음.

 


정리

 인덱스는 데이터베이스의 빠른 검색을 위한 데이터 위치 정리 구조임.

 MySQL에서는 B+Tree 방식으로 데이터 위치를 효율적으로 관리함.

 인덱스를 잘 사용하면 성능이 극적으로 향상되나, 과도한 인덱스는 오히려 성능을 떨어뜨릴 수 있으므로 꼭 필요한 곳에만 적절히 사용해야 함.

 

 

 

 

출처 : ChatGPT

'Infra > Performance' 카테고리의 다른 글

Artillery (부하테스트 툴)  (0) 2025.03.26
병목현상  (0) 2025.03.22
성능 최적화  (0) 2025.03.20