반응형
목차
이전 게시물
https://lotuus.tistory.com/167
다양한 관점으로 인덱스를 분류할 수 있습니다.
물리적으로 정렬하나요?
Clustered Index
- 테이블의 레코드를 지정된 컬럼으로 물리적으로 재배열하는 인덱스입니다.
- 테이블당 하나의 클러스터드 인덱스만 가질 수 있습니다.
- 일반적으로 primary key가 설정된 컬럼은 자동으로 Clustered Index로 설정됩니다.
- ⇒ Primary Key를 어떤 컬럼으로 지정하는지에 따라 데이터베이스의 성능이 좌우될 수 있습니다.
- 장점
- 인덱스가 곧 데이터이기 때문에, 인덱스 저장공간이 필요 없습니다.
- 인덱스가 곧 데이터이기 때문에, Pointer(레코드위치값)을 확인하지 않고 바로 데이터에 접근할 수 있습니다.
- 날짜나 시간처럼 순차적으로 접근되거나 범위 검색이 많이 발생하는 경우에 유용합니다.
- 단점
- 인덱스를 다른 컬럼으로 다시 생성하면, 데이터가 물리적으로 다시 정렬됩니다.
Non-Clustered Index
- 테이블의 레코드는 그대로 두고 지정된 컬럼에 대해 정렬된 인덱스를 만듭니다.
- 테이블에 여러 개의 논클러스터드 인덱스를 생성할 수 있습니다.
- 일반적으로 primary key 이외의 모든 인덱스는 논클러스터드 인덱스로 간주됩니다.
- 장점
- 다양한 인덱스를 생성하여 여러가지 쿼리를 최적화 할 수 있습니다.
- 단점
- 인덱스를 탐색한 후 실제 데이터 레코드를 참조해야합니다.
- 인덱스 데이터를 저장하는데에 저장공간이 필요합니다.
컬럼을 여러개 지정하나요?
단일 인덱스
- 계속 알아봤던 내용이기 때문에 생략하겠습니다.
복합 인덱스
- 여러 컬럼을 인덱스로 구성합니다.
- 컬럼이 지정된 순서대로 인덱스가 생성됩니다.
- 데이터베이스는 컬럼이 지정된 순서대로 데이터를 필터링 합니다.
- 지정된 순서 반대로 검색하면, 만들어진 인덱스를 활용하지 못할 수도 있습니다!!
EX. 테이블 employees, 복합인덱스 (last_name, first_name) 설정
- SELECT * FROM employees WHERE last_name = 'Smith' // 인덱스 활용 가능
- SELECT * FROM employees WHERE first_name = 'John' // 인덱스 활용 불가!!!!
- SELECT * FROM employees WHERE last_name = 'Smith' AND first_name = 'John' // 인덱스 활용 가능
실제 레코드까지 접근 하나요?
커버링 인덱스
- 쿼리로 가져올 데이터가 인덱스의 key값과 동일해서, 실제 레코드를 읽지 않아도 될 경우에 사용됩니다.
EX. 테이블 users, 단일인덱스(age), 단일인덱스(name) 설정
SELECT name, age FROM users WHERE age > 30;
논 커버링 인덱스
- 위의 반대의 경우입니다.
- 실제 레코드를 읽어야 할 경우에 사용됩니다.
다음 게시물
https://lotuus.tistory.com/169
반응형
'Backend' 카테고리의 다른 글
인덱스(4) : 생성, 삭제, 사용, 테스트하기 + 실행계획 보는법 (0) | 2024.07.17 |
---|---|
인덱스(2) : 인덱스가 데이터를 검색하는 방법 (1) | 2024.07.17 |
인덱스(1) : 인덱스를 사용하는 이유, 인덱스의 정의, 인덱스에 저장되는 데이터 (0) | 2024.07.17 |
[SpringBoot] UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only 해결후기 (6) | 2022.12.06 |
[SpringBoot] Jpa Connection Minimum-Idle 설정하지 말자... 에러 후기 (0) | 2022.12.04 |