MySQL에서 인덱스(Index)를 사용한 성능 최적화란?
MySQL에서 인덱스(Index)를 사용한 성능 최적화란, 데이터베이스가 특정 데이터를 빠르게 찾을 수 있도록 데이터의 위치를 미리 정리하여 보관하는 방법임.
인덱스는 흔히 도서관의 책 색인에 비유할 수 있음.
예를 들어, 도서관에서 특정 주제의 책을 찾으려면, 책 전체를 하나씩 확인하는 대신 색인을 보고 원하는 책을 바로 찾는 것과 같음.
인덱스를 설정하면 MySQL 역시 데이터를 빠르게 검색할 수 있게 됨.
인덱스가 없을 때의 문제점 (성능 저하)
먼저, 인덱스가 없을 경우의 문제를 알아보겠음.
예를 들어, 다음과 같은 테이블이 있다고 가정함:
예시 테이블 (user):
id | username | age | |
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 |