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은 인덱스를 활용하여 정렬 작업을 최적화할 수 있습니다. 이는 전체 쿼리의 성능을 개선하는 데 기여합니다.