on
인덱스 (Index)
인덱스 (Index)
인덱스 (Index)
인덱스는 RDBMS에서 검색 속도를 향상하기 위한 자료구조이다
인덱스를 활용한다면 SELECT 구뿐만 아니라 UPDATE, DELETE의 성능도 향상할 수 있다
이유는 해당 연산을 수행하려면 해당 대상을 조회해야만 작업을 할 수 있기 때문이다.
만약 Index를 사용하지 않는 컬럼을 조회하는 상황이라면 전체 탐색을 하는 Full Scan이 수행된다.
Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어질 수 있다.
index
인덱스의 종류
1. Clustered Index
Clustered Index는 개발자가 설정하는 Index가 아닌 SQL이 자동으로 설정하는 Index다.
해당 테이블에 Auto Increment값으로 PK가 존재한다면 해당 칼럼이 자동으로 Clustered Index가 된다.
테이블당 1개만 존재할 수 있으며 Clustered Index를 기준으로 정렬된다. 정렬되기 때문에 리프 노드가 필요 없게 되어 추가적인 공간이 필요하지 않다.
2. Non-Clustered Index
Non-Clustered Index 테이블의 페이지를 정렬하지 않고 새로운 공간을 할당한다.
인덱스 관리
DBMS는 인덱스를 항상 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
그렇기 때문에 인덱스가 적용된 칼럼에 INSERT, UPDATE, DELETE가 수행된다면 다음과 같은 연산을 추가적으로 하여 그에 따른 오버헤드가 발생한다.
- INSERT: 새로운 데이터에 대한 인덱스를 추가한다.
- DELETE: 삭제하는 데이터의 인덱스를 삭제하지 않고, 사용하지 않는다는 작업을 수행한다.
- UPDATE: 인덱스에는 Update구의 개념이 존재하지 않는다. DELETE 발 생후 INSERT 작업이 일어나게 된다.
인덱스의 장점 및 단점
장점
- 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있음.
- 전반적인 시스템 부하를 줄일 수 있음.
단점
- 인덱스를 관리하기 위해 테이블의 약 10%에 해당하는 추가 저장공간이 필요함.
- 인덱스를 관리하기 위한 추가 작업이 필요함.
- 인덱스를 잘못 사용할 경우 오히려 성능 저하될 수 있음.
- 테이블 수정 작업의 경우 추가적인 오버헤드 발생.
수정이 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져서 성능이 오히려 저하되는 역효과가 발생할 수 있다.
그러한 이유 중 하나는 DELETE, UPDATE 연산은 기존의 인덱스를 삭제하지 않고, 사용하지 않음 처리를 하기 때문에 UPDATE, DELETE 연산이 빈번하게 발생된다면 실제 데이터보다 인덱스의 크기가 더 커질 수 있다.
인덱스를 사용하면 좋은경우
- 규모가 작지 않은 테이블
- INSERT, DELETE, UPDATE가 자주 발생하지 않는 칼럼
- 결합이나 WHERE, ORDER BY에 자주 사용되는 칼럼
- 카디널리티가 높은 칼럼
- 카디널리티란? 값의 균형을 나타내는 개념.
카디널리티가 가장 높은 필드는 모든 레코드에 다른 값이 들어가 있는 유일 키 필드. 반대로 모든 레코드에 같은 값이 들어가 있다면 카디널리티가 낮은 필드
- 선택률이 낮은 칼럼
- 선택률이란? 특정 필드 값을 지정했을 때 테이블 전체에서 몇 개의 레코드가 선택되는지를 나타내는 개념. ex. 100개의 레코드를 가진 테이블에서 유일 키로 pkey=1처럼 등호를 지정한다면 한 개의 레코드가 선택. 이때 선택률은 1/100 1%
인덱스를 사용할 수 없는 경우.
- LIKE 연산자 (%문자)
- INDEX 필드로 연산
- IS NULL 사용
- 부정형 사용
from http://jinukix.tistory.com/104 by ccl(A) rewrite - 2021-11-18 11:00:43