JPA 인덱싱

아이스__아메리·2023년 7월 25일
0

JPA

목록 보기
17/18

데이터베이스 인덱스

추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.

인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상되는 효과를 볼 수가 있다.

개념보다는 사용하는 개발자의 입장에서 생각해보면 데이터를 가지런히 정리해놓은 상태로 둔다고 생각하면 편하다.

기본적으로 PK는 인덱싱이 되어있다.

장점
테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
전반적인 시스템의 부하를 줄일 수 있다.

단점
인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
인덱스를 관리하기 위해 추가 작업이 필요하다.
인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.

컬럼의 인덱스 선정 기준

  1. 규모가 작지 않은 테이블
  2. INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  3. JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  4. 데이터의 중복도가 낮은 컬럼

인덱스를 사용하는 것 만큼이나 생성된 인덱스를 관리해주는 것도 중요하다. 그러므로 사용되지 않는 인덱스는 바로 제거를 해주어야 테이블에 비해 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생하는 것을 방지할 수 있다.

자료구조

데이터베이스에서 인덱스를 구현하기 위해서 B+Tree 자료 구조를 활용한다

SPRING JPA 환경에서 적용하기

@Table(indexes = {
        @Index(name = "appId__idx", columnList = "appId", unique = true),
        @Index(name = "accessToken__idx", columnList = "accessToken", unique = true)
})

네이밍

{애트리뷰트명}__idx
__idxidx__로 prefix로 사용해도 상관없다.

여러개 등록가능하다.

위에서 서술한 것처럼 너무 많으면 성능저하가 발생할 수 있다.

실제 코드

@Table(indexes = {
        @Index(name = "appId__idx", columnList = "appId", unique = true),
        @Index(name = "accessToken__idx", columnList = "accessToken", unique = true)
})
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Entity extends TimeBaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Entity_id", columnDefinition = "BIGINT(20) UNSIGNED")
    private Long id;
    private Long appId;
    private String accessToken;
}
profile
츠케멘 좋아

0개의 댓글