DB

[DB] 인덱스란?

수수한개발자 2022. 7. 9.
728x90

인덱스란?

데이터베이스에서 인덱스는 특정 칼럼 값에 대한 목차입니다. 

책을 보면 맨 앞에 목차를 두어 빠르게 찾아갈 수 있게 하도록 도와주는데 이와 비슷한 개념이 INDEX입니다.

테이블의 검색 속도는 데이터가 적으면 상관없지만 10만 개 100만 개 1억 개 점점 데이터가 방대해질수록 속도가 떨어지게 됩니다. 이때 미리 데이터들에 목차가 되는 형태의 index를 설정해두면 검색 속도를 향상할 수 있습니다.

 

예를 들어 사용자가 무수히 많은 티스토리에서 블로그 제목이 'abc;라는 블로그를 찾고자 한다면 다음과 같은 이 쿼리를 짜야할 것입니다.

SELECT title
FROM tistory
WHERE title = 'abc';

인덱스가 없다면 예를 들어 티스토리의 글 개수가 100만 개라면  데이터를 모두 찾아보고 'abc'라는 값과 매칭 되는 결과를 찾아와야 합니다. 데이터가 적으면 상관없지만, 100만 개 1000만 개가 된다면 데이터에서 모든 값들을 하나하나 찾는 건 속도에  큰 영향을 미칩니다.

이때 title 값을 기준으로 index를 만들어주면 title이 a, b, c순으로 정렬되어 있기 때문에 abc 부분에서 문자열을 바로 찾을 수 있습니다. 만약 해당 문자열이 없다면 b로 넘어가서 탐색이 종료되기 때문에 문자열이 없다는 결과를 전체 탐색보다 빨리 알 수 있습니다.

한 테이블에서 여러 개의 index설정이 가능하지만,  인덱스를 추가하면 새로운 Row를 추가할 때마다 인덱스 값 또한 추가해주어야 하기 때문에 성능 이슈를 불러올 수 있습니다. 

 

mysqlL에서의 인덱스 생성/조회/삭제 명령어

1. 생성

1.1 이미 존재하는 테이블에 인덱스 추가하기

CREATE INDEX [INDEX_NAME] ON [TABLE_NAME] ([COLUMN_NAME)];

1.2 테이블 생성시에 인덱스 추가하기

CREATE TABLE [TABLE_NAME] (
....,
INDEX [INDEX_NAME] (COLUMNT_NAME)
);

2. 조회

SHOW INDEX FROM [TABLE_NAME];

3. 삭제

ALTER TABLE [TABLE_NAME] DROP INDEX [INDEX_NAME];

 

Entity에서의 index 생성 방법

@Table(indexes = {
        @Index(columnList = "title"),
        @Index(columnList = "hashtag"),
        @Index(columnList = "createdAt"),
        @Index(columnList = "createdBy")
})
@Entity
public class Article extends AuditingFields{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Setter
    @Column(nullable = false)
    private String title;  // 제목

    @Setter
    @Column(nullable = false, length = 10000)
    private String content;  // 내용

    @Setter
    private String hashtag; // 해시태그
}

위와 같이 @Table 어노테이션 안에 @Index와 index를 추가하고 싶은 칼럼(변수) 명을 적어주면 된다.

728x90

'DB' 카테고리의 다른 글

[Redis] Redis-Sentinel 구축해보기  (0) 2024.02.18
[MySQL] Index - 인덱스 사용법  (2) 2023.12.07
MySQL - 락과 격리 수준  (0) 2023.07.28
[DB] 함수(FUNCTUIN)  (0) 2022.08.23
H2 데이터베이스 설정 초기화 하기  (0) 2022.05.08

댓글