인덱스란?
데이터베이스에서 인덱스는 특정 칼럼 값에 대한 목차입니다.
책을 보면 맨 앞에 목차를 두어 빠르게 찾아갈 수 있게 하도록 도와주는데 이와 비슷한 개념이 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를 추가하고 싶은 칼럼(변수) 명을 적어주면 된다.
'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 |
댓글