추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.
인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상되는 효과를 볼 수가 있다.
개념보다는 사용하는 개발자의 입장에서 생각해보면 데이터를 가지런히 정리해놓은 상태로 둔다고 생각하면 편하다.
기본적으로 PK는 인덱싱이 되어있다.
장점
테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
전반적인 시스템의 부하를 줄일 수 있다.
단점
인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
인덱스를 관리하기 위해 추가 작업이 필요하다.
인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
인덱스를 사용하는 것 만큼이나 생성된 인덱스를 관리해주는 것도 중요하다. 그러므로 사용되지 않는 인덱스는 바로 제거를 해주어야 테이블에 비해 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생하는 것을 방지할 수 있다.
데이터베이스에서 인덱스를 구현하기 위해서 B+Tree 자료 구조를 활용한다
@Table(indexes = {
@Index(name = "appId__idx", columnList = "appId", unique = true),
@Index(name = "accessToken__idx", columnList = "accessToken", unique = true)
})
{애트리뷰트명}__idx
__idx
는 idx__
로 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;
}