728x90
Index 인덱스란 뭘까 ?
데이터베이스 인덱스는 추가 쓰기 및 저장 공간을 희생 하여 테이블에 대한 데이터 검색 작업의 속도를 향상시키는 데이터 구조입니다 .
(DB에서 검색이 이루어 질땐 컴퓨터는 처음부터 끝까지 모든 데이터를 검색한다.)
JPA에서 Index를 설정한다는 것은
대부분 단일 테이블에서 선택한 데이터 열을 복사하여 만들어 놓는다.
어떤 엔티티를 대상으로 사용해야 할까 ?
* 중복도가 낮은 것 !
주민번호 / 중복이 낮다.
성별 / 중복이 매우 높다. 같이 남 / 여 두가지만 존재하여 여러값들이 중복이 많은 데이터는 피해야 한다 !
* 크기가 큰 테이블
인덱스 설정
@Index
@Target({})
@Retention(RUNTIME)
public @interface Index {
String name() default "";
String columnList();
boolean unique() default false;
}
@Index 에서는 columnList를 필수로 정의해야 한다.
Index 설정하기
@Entity
@Table(name = "post_table", indexes = @Index(name = "idx_post_title", columnList = "post_title"))
public class Post{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "post_title", nullable = false)
private String postTitle;
@Column(name = "post_content", nullable = false)
private String postContent;
}
Entity 클래스에서 post_title 컬럼에 대해 인덱스를 설정해주게 되면 아래의 그림같이 인덱스가 테이블에서 설정이 된 걸 확인할 수 있다.
만약 unique 속성을 걸고 싶다면 unique = true 옵션으로 unique index로 생성이 된다.
@Entity
@Table(name = "post_table", indexes = @Index(name = "idx_post_title", columnList = "post_title", unique = true))
public class Post{
....
}
Non_unique가 0으로 바뀌면서 unique index가 된다.
두개의 컬럼으로 한개의 인덱스 만들기
columnList 의 부분을 , 로 구분하여 두개의 컬럼으로 한개의 인덱스를 만들 수 있다.
@Entity
@Table(name = "post_table", indexes = @Index(name = "idx_post_title_and_content", columnList = "post_title, post_content"))
public class Post{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "post_title", nullable = false)
private String postTitle;
@Column(name = "post_content", nullable = false)
private String postContent;
}
테스트
10,000개의 데이터중 9,990번째 데이터 찾기
인덱스를 걸지 않은 경우
인덱스를 post_title로 설정한 경우
100,000개의 데이터 중 99,990번째 데이터 찾기
결론 : 검색이 자주 필요한 데이터는 인덱스를 잘 활용해보자
728x90
'개-발 > Database' 카테고리의 다른 글
[DB] 인덱스 (0) | 2024.08.07 |
---|---|
[PostgreSQL] 테이블 조회 (시스템 테이블 제외) (0) | 2023.03.26 |
[QueryDSL] 동적쿼리 BooleanBuilder , Where 절 (0) | 2023.03.15 |
[QueryDSL] Predicate / BooleanBuilder (1) | 2023.03.15 |
[QueryDSL] Projection 조회 (0) | 2023.03.15 |