-
Spring JPA에 Index 적용하기프로젝트/WebRTC 화상통화 프로젝트 2022. 8. 2. 00:01
개요
- Spring JPA + MySQL에 Index를 적용해보자
- Index를 어떻게 걸어야 효율적일까?
인덱스(Index)란?
인덱스란 우리가 책에서 원하는 분야를 찾기 위해 처음부터 끝까지 읽는 게 아니라 목차에서 원하는 부분을 찾아 가는 것처럼 데이터베이스에서 데이터를 찾을 때 처음부터 끝까지 읽는 것이 아니라 효율적으로 데이터를 탐색할 수 있게 합니다.
어떻게 빠르게 탐색이 가능할까요?
추가적인 공간을 활용하여 데이터를 정렬시킴으로써 수정,삭제의 성능을 수정하여 조회의 성능을 높입니다.
데이터가 정렬되어있으면 이분탐색을 통해 원하는 데이터를 빠르게 탐색할 수 있는 것을 떠올릴 수 있습니다.
인덱스에 대해서 조금 더 자세하게 알고 싶거나 이해가 되지 않는다면 다음 글을 참고하세요
https://junuuu.tistory.com/211
MySQL에서 자동으로 생성되는 인덱스
PK를 기준으로 자동으로 인덱스가 생성됩니다.
Unique 제약조건이 걸려있으면 자동으로 인덱스가 생성됩니다.
또한 클러스터형 인덱스는 테이블당 하나만 생성되는데 PK를 기준으로 자동 생성됩니다.
테이블에 따라 클러스터형 인덱스가 필요없을 수도 있습니다.
MySQL과 같은 특정 DB는 FK를 걸면 FK에 index를 걸어주기도 한다.
Index를 어떻게 걸어야 효과적일까?
클러스터형 인덱스 활용
활용하지 않는 클러스터형 인덱스를 제거하고 많이 활용되는 넌클러스터형 인덱스를 클러스터형 인덱스로 승격시키기
Cardinality
특정 컬럼을 기준으로 중복도가 높으면 카디널리티가 낮고, 중복도가 낮으면 카디널리티가 높다고 한다.
만약 중복도가 높은 남자/여자 컬럼의 경우에는 인덱스를 활용해도 절반밖에 걸러주지 않습니다.
복합/결합 인덱스
결합인덱스를 사용할 때는 Cardinality가 높은 인덱스를 먼저 사용해야 효과가 좋습니다.
복합 인덱스는 커버드쿼리시에 좋은 성능을 발휘합니다.
커버드쿼리란?
넌 클러스터 인덱스로 조회 시 데이터 블록이 없기 때문에 PK로 데이터 블록을 찾는 과정이 없는 경우
또한 개발자가 결합 인덱스의 두 번째 컬럼만을 where 절에 조건으로 사용하고 결합 인덱스를 사용하고자 했다면 실행계획은 인덱스를 사용하지 못합니다. 따라서 쿼리문 작성 시 결합 인덱스를 사용하고자 한다면 반드시 결합 인덱스의 컬럼 중 선행하는 컬럼부터 조건에 지정하여 사용하여야 합니다.
실제로 인덱스 적용하기
JPA로 단일 컬럼 인덱스 생성하기
@Table(name = "exercise", indexes = { @Index(name = "date_idx", columnList = "exercise_date") })
JPA 복합 인덱스 생성하기
@Table(name = "registration", indexes = { @Index(name = "member_team_idx", columnList = "member_id, team_id", unique = true), @Index(name = "team_idx", columnList = "team_id") })
mysql에서 클러스터형 인덱스 변경하기
내부적으로 클러스터형 인덱스를 변경하는 방법은 찾지 못했습니다.
https://stackoverflow.com/questions/13779138/mysql-how-do-you-create-a-clustered-index
mysql은 다음 절차로 클러스터형 인덱스를 생성합니다.
1. mysql은 pk로 클러스터형 인덱스를 만든다.
2. pk가 없다면 unique column에서 인덱스를 만든다.
3. 둘다없다면 내부적으로 행 ID 값을 포함하는 GEN_CLUST_INDEX라는 숨겨진 클러스터형 인덱스를 생성합니다.
출처
https://ivvve.github.io/2020/07/08/server/rdb/is-fk-indexed/
인덱스 사용시 고려사항 : 네이버 블로그 (naver.com)
https://www.baeldung.com/jpa-indexes
https://stackoverflow.com/questions/13779138/mysql-how-do-you-create-a-clustered-index
'프로젝트 > WebRTC 화상통화 프로젝트' 카테고리의 다른 글
AOP 적용하기 (+원리 CGlib vs Dynamic Proxy) (0) 2022.08.04 스프링 시큐리티가 OAuth 로그인을 처리하는 방법 (0) 2022.08.03 Redis Sorted Set을 이용한 실시간 랭킹 시스템 구축(1) (0) 2022.08.01 Base62 인코딩을 활용해 초대링크 만들기 (0) 2022.07.31 JPA Entity 연관관계 구현하기(양방향 연관관계 List Empty 문제 해결) (0) 2022.07.29