복합 인덱스와 개별 인덱스의 차이

성민·2023년 3월 24일
0

수행할 쿼리

SELECT b.id, b.introduce, b.created_at, b.updated_at, b.member_id,
       SUM(bo.view_count) AS total_view_count,
       COUNT(bwm.id) AS total_wishes_members_count
FROM blogs b
LEFT JOIN boards bo ON b.id = bo.blog_id
LEFT JOIN board_wishes_members bwm ON bo.id = bwm.board_id
GROUP BY b.id
ORDER BY total_view_count DESC, bo.created_at DESC;

해당 쿼리는 블로그를 게시글의 조회수를 기준으로 정렬하고 같은 조회수일 경우 최근에 게시글을 작성한 블로그가 상위로 오도록 처리하며 블로그 정보와 블로그의 총 조회수, 블로그에 좋아요 한 수를 조회하는 쿼리입니다.

인덱스 :

인덱스(index)는 데이터베이스에서 데이터 검색 속도를 향상시키기 위한 자료구조입니다. 인덱스는 특정 테이블의 하나 이상의 컬럼(column)에 대해 생성될 수 있습니다. 인덱스를 사용하면 데이터베이스는 테이블 전체를 스캔하지 않고도 빠르게 필요한 레코드(record)를 찾을 수 있습니다. 이는 검색, 정렬 및 필터링 작업의 성능을 크게 향상시킬 수 있습니다.

개별 인덱스:

쿼리 유연성: 각 컬럼에 대해 개별 인덱스를 생성하면, 쿼리에서 단일 컬럼을 사용하는 경우에도 인덱스를 활용할 수 있습니다. 이는 여러 가지 쿼리 유형에 대해 성능을 향상시킬 수 있습니다.
저장 공간: 각 컬럼에 대해 개별 인덱스를 생성하면, 인덱스가 차지하는 저장 공간이 더 클 수 있습니다. 이는 각 인덱스를 개별적으로 관리해야 하므로 전체 인덱스 관리 비용이 증가할 수 있습니다.
유지 관리: 각 컬럼에 대해 개별 인덱스를 생성하면, 인덱스 관련 작업 (추가, 수정, 삭제)을 각각 수행해야 하므로 관리가 복잡해질 수 있습니다.

인덱스 스캔: 복합 인덱스를 사용하면, MySQL은 인덱스를 스캔하여 필요한 데이터를 빠르게 찾을 수 있습니다. 이를 통해 전체 테이블을 스캔하는 것보다 데이터 처리 속도가 향상됩니다.

복합 인덱스:

쿼리 최적화: 복합 인덱스는 여러 컬럼을 조합하여 인덱스를 구성하므로, 해당 컬럼들이 동시에 사용되는 쿼리의 경우 성능이 더 향상됩니다. 이는 인덱스를 한 번만 스캔하여 필요한 데이터를 빠르게 가져올 수 있기 때문입니다.
저장 공간: 복합 인덱스는 여러 컬럼을 하나의 인덱스로 저장하므로, 인덱스가 차지하는 저장 공간이 적을 수 있습니다. 이는 전체 인덱스 관리 비용을 줄일 수 있습니다.
유지 관리: 복합 인덱스는 하나의 인덱스로서 관리되므로, 인덱스 관련 작업 (추가, 수정, 삭제)을 보다 쉽게 수행할 수 있습니다.

선택 요인:

쿼리 패턴: 애플리케이션에서 주로 사용되는 쿼리 패턴을 분석하고, 인덱스를 사용할 수 있는 쿼리가 어떤 컬럼을 동시에 사용하는지 확인하세요. 복합 인덱스는 여러 컬럼을 동시에 사용하는 쿼리에 더 효과적입니다.

컬럼의 선택도: 각 컬럼의 선택도를 고려해야 합니다. 선택도가 높은 컬럼 (고유한 값이 많은 컬럼)은 개별 인덱스로 사용하는 것이 좋을 수 있습니다. 이는 쿼리의 결과 집합을 빠르게 줄여 성능을 향상시킬 수 있기 때문입니다.

쿼리의 필터링 및 정렬: 쿼리에서 어떤 컬럼을 필터링 또는 정렬에 사용하는지 확인하세요. 인덱스를 사용하는 쿼리에서는 필터링 및 정렬 작업이 더 빠르게 수행될 수 있습니다. 따라서 이러한 작업에 사용되는 컬럼은 인덱싱을 고려해야 합니다.

인덱스 관리 비용: 인덱스를 추가하면 데이터베이스 관리에 추가 비용이 발생합니다. 인덱스를 업데이트하거나 재구성해야 하는 경우가 있으므로, 사용되지 않는 인덱스는 제거해야 합니다. 그렇지 않으면 인덱스 관리 비용이 증가하게 됩니다.

해당 쿼리를 기준으로 인덱스를 설정한 이유

인덱스 스캔: 복합 인덱스를 사용하면, MySQL은 인덱스를 스캔하여 필요한 데이터를 빠르게 찾을 수 있습니다. 이를 통해 전체 테이블을 스캔하는 것보다 데이터 처리 속도가 향상됩니다.

조인 최적화: 쿼리에서 LEFT JOIN을 사용하여 'blogs'와 'boards' 테이블을 조인하고 있습니다. 복합 인덱스가 있는 경우, MySQL은 조인 작업을 보다 효율적으로 수행할 수 있습니다. 인덱스를 사용하면 조인 시 blog_id 컬럼을 기준으로 빠르게 관련 레코드를 찾을 수 있기 때문입니다.

정렬 최적화: 쿼리에서 결과를 total_view_count와 boards.created_at에 따라 정렬하고 있습니다. 복합 인덱스를 사용하면, MySQL은 인덱스를 활용하여 정렬 작업을 최적화할 수 있습니다. 이는 전체 쿼리의 성능을 개선하는 데 기여합니다.

0개의 댓글