데이터베이스에는 대량의 데이터가 존재하는 테이블에서 필요한 데이터를 빠르게 조회하기 위한 자료구조로, 인덱스(INDEX)를 사용하고 있다. 이러한 인덱스(INDEX)의 사용으로 대용량의 데이터가 존재하는 웹 애플리케이션에서 성능을 낼 수 있다.
인덱스(INDEX)란 무엇인가?
인덱스(INDEX)는 데이터베이스에서 제공해 주는 자료구조로 데이터를 빠르게 조회하는 데 사용할 수 있습니다. 정렬된 형태로 테이블의 특정 칼럼에 생성되며, 실제 지정된 칼럼을 기준으로 데이터를 조회할 때 더욱 빠르게 데이터를 조회할 수 있습니다. 즉, 특정 칼럼에 색인을 주어 검색 속도를 향상하기 위해 사용됩니다.
Full Scan VS Range Scan
그렇다면 이제 인덱스(INDEX)를 사용하는 것이 아닐 때 보다 왜 높은 성능을 낼 수 있는지 알아보도록 하겠습니다. 그 원리는 바로 인덱스(INDEX)를 사용하는 것이 테이블의 전체를 읽는 것이 아닌, 부분적인 범위내에서의 조회를 하기 때문입니다. 그 개념이 바로 풀 스캔과 레인지 스캔이라는 개념입니다.
우선 풀스캔(Full Scan)입니다.
1 | ||
2 | ||
3 |
풀 스캔(Full Scan)처럼 테이블의 모든 레코드를 처음부터 끝까지 읽는다. 이와 같은 방식으로 스캔을 하게 되면 레코드의 수가 늘어나면 늘어날수록 조회를 처리하는 시간이 길어진다.
다음은 레인지 스캔(Range Scan)입니다.
1 | ||
2 | ||
위에서 확인할 수 있듯이 레인지 스캔(Range Scan)을 사용하면 지정한 범위에서만 레코드를 읽기 때문에 당연히 전체를 읽는 풀 스캔(Full Scan)보다 빠른 속도로 데이터를 조회할 수 있습니다.
그렇다면 어떤 컬럼을 기준으로 인덱스(INDEX)를 생성할까?
- WHERE절에 자주 사용되는 칼럼
- 고유한 값이 있는 칼럼
- JOIN에 사용되는 칼럼
하지만 위의 기준과 다르게 인덱스에 해당하는 칼럼을 너무 많이 사용하거나 잘못된 칼럼에 인덱스를 생성하는 것은 성능을 저하시키는 요소가 될 수 있으므로 신중하게 사용해야 합니다.
인덱스(INDEX) 생성 예시 쿼리
-- products 테이블의 name 열에 INDEX 생성
CREATE INDEX idx_name ON products (name);
-- users 테이블의 age 열에 UNIQUE INDEX 생성
ALTER TABLE users ADD CONSTRAINT idx_age UNIQUE (age);
맺음말
이번 포스팅에서는 데이터 베이스에서 성능 향상을 위해 제공해 주는 자료구조인 인덱스에 대해 알아보았습니다. 올바르게 인덱스를 사용하여 데이터 조회속도를 개선하고, 쿼리 성능을 향상할 수 있는 계기가 되었으면 좋겠습니다.
'RDBS > MYSQL' 카테고리의 다른 글
[MySQL]UNION, UNION ALL(데이터 병합) 구문 알아보기 (21) | 2023.08.04 |
---|---|
[MySQL]데이터베이스 튜닝, 최적의 성능을 위한 5가지 핵심 팁 (30) | 2023.07.22 |
[MySQL]테이블 수정하기, ALTER TABLE 총 정리하기 (2) | 2023.07.16 |
[MySQL]GROUP_CONCAT을 활용하여 그룹 별 데이터 나열하기 (6) | 2023.07.11 |
[MySQL]동시성 문제를 해결할 FOR UPDATE 알아보기 (1) | 2023.07.09 |