RDBS/MYSQL

[MySQL]인덱스(INDEX)가 웹 애플리케이션의 성능을 올릴 수 있는 이유

MoonSta 2023. 7. 24. 22:38

 데이터베이스에는 대량의 데이터가 존재하는 테이블에서 필요한 데이터를 빠르게 조회하기 위한 자료구조로, 인덱스(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)를 생성할까?

  1. WHERE절에 자주 사용되는 칼럼
  2. 고유한 값이 있는 칼럼
  3. 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);

 


 

맺음말

 이번 포스팅에서는 데이터 베이스에서 성능 향상을 위해 제공해 주는 자료구조인 인덱스에 대해 알아보았습니다. 올바르게 인덱스를 사용하여 데이터 조회속도를 개선하고, 쿼리 성능을 향상할 수 있는 계기가 되었으면 좋겠습니다.