Develop record

[Spring JPA] Index 본문

Backend/JPA

[Spring JPA] Index

seong's log 2024. 6. 26. 17:24
  • 데이터베이스의 테이블의 컬럼을 복사한 사본
  • 데이터가 많을 경우 검색하는데 시간이 오래걸리는 단점을 보완하기 위해 만듦 -> 컬럼을 복사하여 정렬 해두면 빠르게 검색가능
  • index 가 있을 경우 컴퓨터가 binary search 를 자동으로 해줌
  •  단점
    • db 용량 증가, 원본 테이블 추가/수정/삭제 시 index도 수정/삭제를 반영해야하기 때문에 소요 시간이 증가함
    • 꼭 필요한 컬럼에만 index 만들 것

index 만들기

 

1. 하나만 만들 때

@Entity 
@Table(indexes = @Index(columnList = "인덱스만들 컬럼명", name = "작명"))
public class Item {

}

 

2. 여러개 만들 때 

@Entity
@Table(indexes = {
  @Index(name = "인덱스이름작명", columnList = "인덱스만들컬럼명1"),
  @Index(name = "인덱스이름작명", columnList = "인덱스만들컬럼명2")
})
public class Item {

}

 

3. multi column index (여러 컬럼을 한꺼번에 합친 index)


성능테스트

 

application.properties 설정파일에 아래 문장 추가 시 SQL 실행시 걸린 시간 확인 가능

spring.jpa.properties.hibernate.generate_statistics=true

 

DB에서 자료 검색 SQL 문법 작성 후 EXPLAIN 키워드 앞에 붙이면 index 사용여부 확인 가능


full text index

  • 문자 검색을 위한 index
  • find(All)By컬럼명Contains(변수) : index가 필요 없어 존재 여부 관계없이 느리게 동작
  • JPA 문법 없음 -> DB에서 직접 만들기 / Repository에서 SQL문 만들어 실행
  •  
@Query(value = "실행할SQL문법~~", nativeQuery = true)
타입 함수명(); 

// 예시
// ?1 : 첫번째 파라미터로 받을 값
@Query(value = "select * from shop.item where id = ?1 ?2", nativeQuery = true)
Item rawQuery1(Long num, String text);